蓝色风格企业网站模板,游戏在线玩免费免登录,wordpress短视频主题,内部网站建设计划CMS的垃圾回收机制#xff0c;为什么分为四步https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器#xff0c;必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入#xff0c;在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot…CMS的垃圾回收机制为什么分为四步https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot在JVM上力推的垃圾收集器并赋予取代CMS的使命。
简述
G1垃圾收集器不同于老版垃圾收集器采用了独特的内存管理策略实现了对整个堆空间的垃圾收集。G1分代上还是参考了老版的设计思想。它将堆内存分为多个大小相等的区域Region每个Region可以是Eden区、Survivor区或者Old区。 通过以下参数可以启用G1、设置Region的大小等
// 整堆启用G1的垃圾回收器
-XX:UseG1GC// 设置最大暂停时间默认200ms
-XX:MaxGCPauseMillisn// 指定Region的内存大小n必须是2的指数幂其取值范围是从1M到32M
-XX:G1HeapRegionSizen// 指定垃圾回收工作的线程数量
-XX:ParallelGCThreadsnG1还对大对象Humongous进行了独立的处理在国内的很多资料中介绍都会称为Humongous区将该Region和Old区进行区分开来。但是我参考外网的资料我发现其介绍如下 In G1 GC weve already described how objects are stored in regions. If the object size is equal to or greater than 50% of the region size, it is considered a humongous object. Humongous objects are allocated directly to the old generation, are handled differently and can cause fragmentation. 如果我没理解错的话大对象会直接分配到Old区并没有独立分区的概念。
Whatever为便于理解我们还是称为Humongous区。
Houmongous区的判断规则为当一个对象大于或等于Region大小的50%甚至可能横跨了多个Region来存放。
G1根据每个Region的垃圾收集情况来决定下一次的垃圾收集Region这样避免了对整个堆内存收集从而减少垃圾收集时间。
原理
G1垃圾收集模式有两种Young GC和Mixed GC
Young GC主要针对年轻代区域包括Eden区和Survivor区。当所有Eden区使用率达到了最大阈值默认60%或者G1计算出来的回收时间接近用户设定的最大暂停时间时会触发Young GC。将这两个Region的对象复制到另外的Survivor。
Young GC在收集时采用了三个关键技术分别是记忆集、卡表和写屏障。
记忆集是G1内部维护引用关系表记录了跨代引用不会记录年轻代的互相引用即非回收区域老年代对象引用回收区域对象的关系。卡表、卡页每个Region可以继续划分就成为卡页每个Region会额外配置一小块内存用于记录堆中哪些卡页引用了自己Region中的对象称为卡表。如果引用了自己Region中的对象则称为脏卡。写屏障实际上是更新卡表的技术类似于Java中AOP技术。在用户线程中老年代的对象引用了年轻代对象时更改卡表中对应的字节为脏卡同时将脏卡放入一个队列中JVM有独立的线程定期读取队列中的数据更新数据集。 记忆集记录了跨代的引用在GC的时候可以快速的借助它和GC Roots搞定跨代引用的可达对象分析问题提高收集效率。 Mixed GC为G1特有的收集方式针对年轻代和部分老年代区域。当老年代的使用率达到了阈值默认45%或年轻代被分配了Humougous对象会触发Mixed GC回收所有年轻代和一部分老年代区。 在回收老年代的时候往往因为对象较多G1为提高收集效率并减少STW耗时长的阶段采用了用户线程并行方式总体分为初试标记、并发标记、最终标记、清理和转移。这几个方式听起来是不是和CMS的部分阶段挺类似的。
初始标记阶段G1会短暂STW快速标记出和GC Roots跟对象直接关联的对象。并发标记阶段是从GC Roots直接关联的对象出发完整遍历堆内的关联对象这个耗时较长但是与用户线程并行。最终标记会STW主要用于修正并发标记期间发生变动的对象。清理阶段也会暂停用户线程在标记完成后G1垃圾收集器会整理Region区调整记忆集当某个Region没有存活对象后则清理该Region。转移阶段也会STW将某个Region存活的对象赋值到另外一个Region。
总结
在上面的原理中Mixed GC会暂停用户线程三次但是在G1垃圾收集器中采用的记忆集、卡表和写屏障的技术有点类似数据库的索引一样最大程度的减少了STW的时间。
当整个G1垃圾收集器也并不是我所描写的这么简单例如MixedGC中用到的三色标记算法和SATB技术还有更多深层的技术细节期待与诸位共同学习本文仅做初步的概念普及。 欢迎使用haptool.com(哈普工具)让程序员的工作更有效率。