0%

JVM笔记

1.par new + cms 的GC,如何保证只做ygc,jvm参数如何配置?
答:首先上线系统后,要借助一些工具观察每秒钟会新增多少对象在新生代里,然后多长时间触发一次Minor GC,平均每次Minor GC之后会有多少对象存活,Survivor区是否可以放的下。这里的关键点就是必须让Survivor区放下,而且不能因为动态年龄判定规则直接升入老年代,然后只要Survivor区可以放下,那么下次Minor GC后还是存活这么多对象,依然可以在另外一块Survivor区放下,基本就不会有对象升入老年代。


2.当老年代的可用内存空间小于新生代所有对象的总大小时,无论有没有空间分配担保,最坏的情况都是一次Minor GC + Full GC,那为什么还需要分配担保机制?直接Minor GC,之后再进行那三种判断不就行了,HandlePromotionFail的意义何在?
答:如果没有开启一个检查,此时可能提前Full GC,那么这样就太频繁了,如果经过检查机制,发现不需要Full GC就直接Minor GC;差别在于不需要频繁Full GC。


3.CMS垃圾回收器
CMS在执行一次垃圾回收的过程一共分为4个阶段:
1.初始标记: 这个阶段会让系统的工作线程全部停止,进入“Stop the World”状态,然后标记出来所有GC Roots直接引用的对象。虽说要造成“Stop the World”,但其实影响不大,因为他的速度很快,仅仅标记GC Roots直接引用的那些对象。
2.并发标记: 这个阶段会让系统线程可以随意创建各种对象,继续运行,在运行期间可能会创建新的存活对象,也可能会让部分存活对象失去引用,变成垃圾对象,在这个过程中,垃圾回收线程,会尽可能的对已有的对象进行GC Roots追踪。这个阶段是对老年代所有对象进行GC Roots追踪,是最耗时的,他需要追踪所有对象是否从根源上被GC Roots引用了,但这个最耗时的阶段,是跟系统程序并发运行的,所以其实这个阶段不会对系统运行造成影响
3.重新标记: 因为第二阶段结束后,会有很多存活对象和垃圾对象是之前第二阶段没标记出来的,所以此时进入第三阶段,继续让系统程序停下来,再次进入“Stop the World”阶段,然后重新标记下在第二阶段里新创建的一些对象,还有一些已有对象可能失去引用变成垃圾的情况。这个阶段速度很快的,他其实就是对在第二阶段中被系统程序运行变动过的少数对象进行标记,所以运行速度很快。
4.并发清理: 这个阶段就是让系统程序随意运行,然后他来清理掉之前标记为垃圾的对象即可。这个阶段是很耗时的,因为需要进行对象的清理,但是他和系统程序并发运行的,所以其实也不影响系统程序的执行。
CMS性能分析:第一和第三阶段虽然需要“STW”,但是这两个阶段都是简单的标记,速度非常快,基本上对系统运行响应也不大;第二和第四阶段是最耗时的,但都是和系统程序并发执行的,基本这两个最耗时的阶段对性能影响不大。

-------------本文结束感谢您的阅读-------------

本文标题:JVM笔记

文章作者:

发布时间:2021年04月23日 - 20:04

最后更新:2021年08月22日 - 17:08

原始链接:http://www.liyyao.com/202104232053.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。