记录学习jvm笔记

JVM调优学习笔记,获取JVM各个时代的内存信息,来进行判断是栈溢出还是堆溢出 查看GC信息 public class Test01 { public static void main(String[] args) { //-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags //查看GC信息 System.out.println("max memor... 阅读详情

方法区(Method Area)

在JVM中,类型信息和类静态变量都保存在方法区中,类型信息是由类加载器在类加载的过程中从类文件中提取出来的信息。

需要注意的一点是,常量池也存放于方法区中。

程序中所有的线程共享一个方法区,所以访问方法区的信息必须确保线程是安全的。如果有两个线程同时去加载一个类,那么只能有一个线程被允许去加载这个类,另一个必须等待。

在程序运行时,方法区的大小是可以改变的,程序在运行时可以扩展。

方法区也可以被垃圾回收,但条件非常严苛,必须在该类没有任何引用的情况下,详情可以参考另一篇文章:Java性能优化之JVM GC(垃圾回收机制) - 知乎专栏

Java堆(JVM堆、Heap)

当Java创建一个类的实例对象或者数组时,都在堆中为新的对象分配内存。

虚拟机中只有一个堆,程序中所有的线程都共享它。

堆占用的内存空间是最多的。

堆的存取类型为管道类型,先进先出。

在程序运行中,可以动态的分配堆的内存大小。

堆的内存资源回收是交给JVM GC进行管理的,详情请参考:Java性能优化之JVM GC(垃圾回收机制) - 知乎专栏

 

Java栈(JVM栈、Stack)

在Java栈中只保存基础数据类型(参考:Java 基本数据类型 - 四类八种 - 知乎专栏)和自定义对象的引用,注意只是对象的引用而不是对象本身哦,对象是保存在堆区中的。

拓展知识:像String、Integer、Byte、Short、Long、Character、Boolean这六个属于包装类型,它们是存放于堆中的。

栈的存取类型为类似于水杯,先进后出。

栈内的数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。

每一个线程都包含一个栈区,每个栈中的数据都是私有的,其他栈不能访问。

每个线程都会建立一个操作栈,每个栈又包含了若干个栈帧,每个栈帧对应着每个方法的每次调用,每个栈帧包含了三部分:

局部变量区(方法内基本类型变量、变量对象指针)

操作数栈区(存放方法执行过程中产生的中间结果)

运行环境区(动态连接、正确的方法返回相关信息、异常捕捉)


 

本地方法栈

本地方法栈的功能和JVM栈非常类似,用于存储本地方法的局部变量表,本地方法的操作数栈等信息。

栈的存取类型为类似于水杯,先进后出。

栈内的数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。

每一个线程都包含一个栈区,每个栈中的数据都是私有的,其他栈不能访问。

本地方法栈是在程序调用或JVM调用本地方法接口(Native)时候启用。

本地方法都不是使用Java语言编写的,比如使用C语言编写的本地方法,本地方法也不由JVM去运行,所以本地方法的运行不受JVM管理。

HotSpot VM将本地方法栈和JVM栈合并了。

 

程序计数器

在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。

程序计数器仅占很小的一块内存空间。

当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址。如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空(Underfined)。

程序计数器这个内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError(内存不足错误)的区域。

JVM GC(垃圾回收机制)

在学习Java GC 之前,我们需要记住一个单词:stop-the-world 。它会在任何一种GC算法中发生。stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行。当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成。GC优化很多时候就是减少stop-the-world 的发生。

JVM GC回收哪个区域内的垃圾?

需要注意的是,JVM GC只回收堆区和方法区内的对象。而栈区的数据,在超出作用域后会被JVM自动释放掉,所以其不在JVM GC的管理范围内。

JVM GC怎么判断对象可以被回收了?

· 对象没有引用

· 作用域发生未捕获异常

· 程序在作用域正常执行完毕

· 程序执行了System.exit()

· 程序发生意外终止(被杀线程等)

在Java程序中不能显式的分配和注销缓存,因为这些事情JVM都帮我们做了,那就是GC。

有些时候我们可以将相关的对象设置成null 来试图显示的清除缓存,但是并不是设置为null 就会一定被标记为可回收,有可能会发生逃逸。

将对象设置成null 至少没有什么坏处,但是使用System.gc() 便不可取了,使用System.gc() 时候并不是马上执行GC操作,而是会等待一段时间,甚至不执行,而且System.gc() 如果被执行,会触发Full GC ,这非常影响性能。

JVM GC什么时候执行?

eden区空间不够存放新对象的时候,执行Minro GC。升到老年代的对象大于老年代剩余空间的时候执行Full GC,或者小于的时候被HandlePromotionFailure 参数强制Full GC 。调优主要是减少 Full GC 的触发次数,可以通过 NewRatio 控制新生代转老年代的比例,通过MaxTenuringThreshold 设置对象进入老年代的年龄阀值(后面会介绍到)。

狂神说JVM探究.rar B站【狂神说Java】JVM快速入门篇笔记,内有md格式,pdf格式, docx格式笔记,和视频内笔记基本无误。 立即下载

相关推荐

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

【狂神说】JVM学习笔记

JVM学习笔记 1、三种JVM Sun公司HotSpot Java Hotspot™ 64-Bit Server VM (build 25.181-b13,mixed mode) BEA JRockit IBM J9VM 我们学习和使用的大都是: Hotspot 2、JVM体系结构 1.JVM的位置 2.JVM的体系结构 方法区: 方法区存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据; 是jvm规范中的一部分,并不是实际的实现,在实际实现上并不相同(HotSpot在1.7版

qq_44430911的博客 1841

jvm学习笔记--狂神说

jvm学习笔记--狂神说

ProGram_Java521的博客 1570

OpenWRT端口转发与NAT环回冲突的排查与解决

本文详细解析了OpenWRT路由器中端口转发与NAT环回功能冲突导致的内网访问故障。通过生活化类比阐明两者工作原理,提供从基础诊断到内核参数调整、LuCI选项配置及手动编写iptables规则的多套解决方案,并给出进阶排查思路,帮助用户彻底解决内网无法通过公网地址访问服务的常见问题。

weixin_29243279的博客 506

图像去噪实战:Noise2Noise与Noise2Void在医学影像中的应用(附代码)

本文深入探讨了Noise2Noise与Noise2Void在医学影像去噪中的革命性应用,通过自监督学习技术有效解决临床数据配对难题。文章提供详细的代码实现和临床部署方案,展示如何提升低剂量CT、MRI等影像的诊断质量,特别适用于辐射敏感场景和急诊快速处理。

weixin_29092579的博客 241

jvm入门学习笔记-狂神说

3、双亲委派,祖宗不可重写,在加载类的时候通过ClassLoader向上查找,找到了就会覆盖掉用户写的类,这样用户就无法改变源码了。8、虚拟机调优,-Xmx -Xms -XX:+PrintGCDetail,在启动类中配置VmOptions指令。5、Sun--HotSpot虚拟机,jdk官方虚拟机,由于jdk是开源的,多数方法、插件都是用它开发的,所以市场占有率最高。4、native关键字,java最初是C++--,底层是C++写的。6、内存结构、堆--先吃先拉,栈--先吃后拉。

qq_42760375的博客 223

Explorer.exe系统错误,电脑重启后刚开始一段时间正常,过一会桌面任务栏就卡死,可以打开任务管理器

联想E14Win10专业版。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 8050

B站狂神说JVM学习笔记

JVM

jacknoe的博客 851

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

由于并没有开版权验证,而且闪退后也并没有弹框说版权问题,所以还是怀疑环境有什么地方不对。设置步骤,项目配置都没问题,Build也成功,Unity版本是符合要求的2022LTS版本,但是一在真机上运行就闪退。

每日出拳老爷子的博客 3175

五、实战pxe安装ubuntu 22.04 软raid1(实际生产pxe配置)

这段配置文件是一个cloud-init的自动安装配置,用于自动化部署Ubuntu服务器操作系统。它定义了从系统身份、键盘布局、区域设置到磁盘分区和RAID配置的一系列设置,并且包含了在安装过程的最后阶段执行的一些命令。基础设置version: 1指定了autoinstall配置文件的版本。source定义了安装源,这里是ubuntu-server。identity设置了主机名(hostname)、用户(username)和密码(password注意这里的密码是经过加密的。键盘与语言设置。

jundao1997的专栏 999

JVM 学习笔记记录

JVM 学习笔记记录 Sun JDK 监控和故障处理工具 名称 主要作用 jps JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程 jstat JVM Statistics Moitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 jinfo Configuration info for java,显示虚拟机配置信息 jmap Memory Map for java,生成虚拟机的内存转

zjf2671的专栏 787

直捣黄龙~

这篇文章描述了一个矩阵寻路问题,要求计算从起点到终点的最短路径数量及长度。主要思路是通过BFS算法解决:首先标记哨兵警戒区域为禁区,然后从起点出发进行广度优先搜索,记录每个位置的最短步数和路径条数。当到达终点时,输出路径数和步数;若不可达则返回(0,0)。算法使用队列实现BFS,同时处理路径统计和步数记录,适用于网格寻路类问题。

面试高手的博客 216

JVM学习笔记记录

目录JVM学习记录一、什么是JVM1.1、定义:1.2、优点1.3、JVM、JRE和JDK区别二、内存结构2.1、整体结构2.2、程序计数器2.3、虚拟机栈问题辨析内存溢出线程运行诊断3、本地方法栈4、堆定义特点堆内存溢出5、方法区结构内存溢出常量池运行时常量池常量池与串池的关系6、直接内存释放原理直接内存的回收机制总结7、类加载器8、双亲委派模式三、垃圾回收1、如何判断对象可以回收引用计数法可...

Iamxuefather的博客 170

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM学习

最近在学习JVM,目前感觉尚硅谷的不错,但是不知道从哪里获取笔记,正好看到有篇博客整理了很详细的笔记,记录一下。

make_progress_go的博客 358

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java---jvm优化学习笔记记录

浅谈jvm优化(暂时做个记录): 做jvm优化必须了解的基础: 1.jvm的运行参数以及参数的设置 三种:1.标准参数 2.-X参数   3.-XX参数(优化使用最高) 2.jvm的内存模型(堆内存) 年轻代,老年代,(1.7之前的永久代,1.8之后废弃) 3.GC算法的原理与优缺点以及怎么合理配置 GC常用算法:   1.引用计数法:(缺点:不能解决循环引用的问题) 2.标记清除...

weixin_40734403的博客 133

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JVM学习笔记脑图

JVM学习笔记脑图 这是我自己学习JVM 过程中,记录的一些笔记。 当然里面还有一些备注啥的,如果大家需要可以在评论中留下自己的邮箱,我会在看到后给你发送详细的脑图分享。 此笔记,以后持续更新,如有什么错漏之处也可以在评论区留言,验证过后,我也会及时的更新。谢谢!!! ...

qq_15965621的博客 280

JVM学习笔记

JVM学习笔记

m0_46602930的博客 138

JVM实战笔记 第一周(文中多数知识来源学习专栏,本文仅作笔记记录)

一,JVM整体运行原理 .java 文件编译成.class字节码文件,然后类加载器吧 .calss文件中的类加载到JVM中,接着是JVM来执行我们写好的类中的代码, 二,JVM在什么情况下会加载一个类? ...

cdebyteyx的博客 176

JVM学习笔记1-JVM结束生命周期的几种情形

执行System.exit()方法 程序正常执行结果 程序在执行过程中遇到了异常或错误而终止 由于OS错误而导致JVM进程终止

lu322313的博客 188

JVM实战笔记 第二周 分代模型(文中多数知识来源学习专栏,本文仅作笔记记录)

JVM 分代模型: 年轻代,老年代,永久代 年轻代:多数对象存活周期都极短。当方法在JAVA虚拟机栈中 入栈出栈完毕,其局部变量便会消,被变量引用的 对象也失去了引用,等待Minor GC,也叫Young GC 进行垃圾回收(分配新对象时,发现新生代内存空间不足时触发) 老年代:经过多次minor GC后(15?) 任然没有因失去引用被回收的对象 就会进入老年代。 对象分配的一些机制: (1)新生...

cdebyteyx的博客 182

JVM实战笔记 第一周 内存区域(文中多数知识来源学习专栏,本文仅作笔记记录)

1,存放类的 方法区 方法区是在JDK1.8以前的版本里,代表JVM中的一块区域。 主要是放从.class文件里加载的类,和一些类似常量池的东西 1.8以后改名为”Metaspace“,可以认为是”元数据空间“,还是存放我们自己写的各种类相关的信息 2 执行代码指令用的程序计数器 方法区的中加载的类,实际是字节码文件,存放的是计算机可以执行的字节码指令。JVM则会使用自己的字节码执行引擎来执行它。...

cdebyteyx的博客 176

JAVA学习笔记

JAVA学习笔记

qq_46024836的博客 122

重写双亲委派

学习笔记:学习思想/实现方式,代码没有进行测试, public class TestCustomClassLoader extends ClassLoader{ /** * 重新 双亲委派 * 实际上只能处理自定义类加载器的处理模式 * @param name * @return * @throws ClassNotFoundException */ @Override public Class<?> l.

zhouzhen1q的博客 211

JVM学习笔记13 synchronized

bilibili-JVM学习笔记13 JVM学习笔记11 - Java字节码初识 JVM学习笔记12 - 解读笔记11中的attributes 实例方法加 synchronized package new_package.jvm.p46; public class SynchronizedTest1 { private int i = 0; public synchronized void test1() { i++; System.out.printl

晨猫 263

JVM整理思路框图,原创超详细!

自己记的笔记: 原创不易,对你有帮助就点个赞吧。

是小D吖!的博客 258
上一篇: 查看当前数据库近期执行的SQL的耗时
下一篇: 使用dubbo时xml文件dubbo标签报错
尒傑
博客等级 码龄15年 191粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值