码迷,mamicode.com
首页 > 其他好文 > 详细

GC相关知识

时间:2021-07-19 16:54:13      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:异常   根据   导致   org   roots   分析   合并   获取   暂停   

新生代:

1:eden、servicorFrom 复制到ServicorTo,年龄+1
首先,把Eden和ServivorFrom区域中存活的对象复制到ServicorTo区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果ServicorTo不够位置了就放到老年区);
2:清空eden、servicorFrom
然后,清空Eden和ServicorFrom中的对象;
3:ServicorTo和ServicorFrom互换
最后,ServicorTo和ServicorFrom互换,原ServicorTo成为下一次GC时的ServicorFrom区。

 

老年代:

主要存放应用程序中生命周期长的内存对象。
老年代的对象比较稳定,所以MajorGC不会频繁执行。在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。
MajorGC采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

技术图片

如何确定垃圾:

引用计数法:即一个对象如果没有任何与之关联的引用,即他们的引用计数都为0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。

可达性分析:通过一系列的“GC roots”对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。

 

GMS回收过程:

最主要目标是获取最短垃圾回收停顿时间,多线程的标记-清除算法。
初始标记:只是标记一下GC Roots能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。

并发标记:进行GC Roots跟踪的过程,和用户线程一起工作,不需要暂停工作线程。

重新标记:为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。

并发清除:清除GC Roots不可达对象,和用户线程一起工作,不需要暂停工作线程。

技术图片

 

G1回收:

1. 基于标记-整理算法,不产生内存碎片。 2. 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。 G1收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保G1收集器可以在有限时间获得最高的垃圾收集效率。

技术图片

 

GC相关知识

标签:异常   根据   导致   org   roots   分析   合并   获取   暂停   

原文地址:https://www.cnblogs.com/holycai/p/15013120.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!