JVM笔记
jvm的理解和组成部分
jvm主要有三个核心部分,第一个是类加载的系统,运行时数据区还有执行引擎。
- 类加载系统
它主要功能时去查找和验证.class文件,并且去完成内存空间的分配和对象的赋值。 - 运行是数据区
包括方法区,堆区,栈区,程序计数器和本地方法栈。
方法区的主要功能是存储运行时的常量池,字段和方法的一些元数据,还有类的一些元数据。
堆区主要是存储java对象的实例,我们在new的时候,new的类都是存在堆区。
存续计数去是负责保存每个线程执行方法的地址。
本地方法区是负责加载并运行这个native方法。
方法区和堆区是属于线程的共享内存区,是程序员通过编写代码来直接操作的内存区。
栈区和程序计数器还有本地方法栈是线程私有的隔离内存区,是完全由JVM来调度的。
执行引擎主要包括即时编译器和垃圾回收器,即时编译器主要是负责将字节码翻译成CPU指令,垃圾回收器主要是对运行时数据区的数据进行回收和管理。
JVM中有哪些垃圾回收算法呢
主要有标记清除算法,标记复制算法,标记整理算法
- 标记清除算法:会先标记出存活的对象,没有被标记的就是需要回收的垃圾对象。垃圾回收器就会回收这些对象。
缺点:会产生很多内存碎片,会随着系统的运行时间短推移,时间久了,没办法分配大量连续的空间,会导致更加频繁的GC。(老年代采用的是这种办法)当内存碎片比较多的时候,会触发标记整理算法。 - 标记复制算法:把内存分为相等的两个部分,每次使用一部分(伊甸园区),当使用满了后,会把存活对象拷贝到另一个闲置内存区(存活区)。原来部分会被全部回收。此时标记复制算法完成一次GC。
缺点::会导致一半分空间闲置,会造成空间的浪费。并且当,大量复制的时候,耗时会比较长。适合存活对象少,垃圾比较多的场景。(年轻代采用这个方法) - 标记整理算法:会标记出所有存活的对象,然后吧所有存活的对象整理到内存空间的另一端。
缺点:会把存活的对象移到一起,增加了一个移动的动作,耗时会更久。
JVM是如何确定一个对象是否要回收
会通过一个可达性分析的算法,可达就不能被回收,不可达就回收(GC root顺着对象的引用去查找对象,找到的就是可达对象,具体包括类的静态属性,栈中的局部变量,常量引用,JNI的引用)
JVM调优
一般使用默认值,JVM参数分为三种,一种是标准参数(查看信息,如JVM标准号等 ),一种是X参数,一种是XX参数(后两种是设置内存参数)
-Xms 分配初始大小 配置最小的堆内存 M为单位,默认物理内存的1/64
-Xmx 配置最大的堆内存 xmx和xms 这两个一般设置大小一致,避免堆内存自动扩展,和内存抖动,从而印象程序的稳定性
-Xmn 是用来设置新生代大小的
https://www.bilibili.com/video/BV1kt4y1h7ck/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598
https://juejin.cn/post/6844903802378665997?searchId=20230820103826AF0A19914D6537D9CA85
Young GC 和full GC
频繁Young GC原因可能:说明有一段时间频繁创建新对象并且被频繁回收,可能是循环内部不断创建局部对象导致的,也可能是死循环,或者Young区设置小。解决方法:要么更改程序减少循环,要么增大Young区
每个线程都有自己的程序计数器,在CPU时间片切换的时候,从程序计数器中找到下一条程序的地址。(唯一不会内存溢出的地方)
虚拟机栈 (存放一个线程运行时候所需要的空间)
每个方法都会创建一个栈帧
深度剖析JVM调优法则:从两大特性CPU、内存出发轻松掌握调优实战技巧
https://juejin.cn/post/7235820837005443130?searchId=202307291405539A4BD1E89775D35C263D#heading-0
变化,从Java 8开始,JVM将传统的方法区(Permanent Generation,永久代)替换为了元空间(Metaspace)
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)