新生代分为Eden区和两个survivor区。老年代是一块连续区域。html
只有FullGC时才可能发生内存整理。java
新生代淡绿色,老年代蓝色。系统运行一段时间后CMS堆内存可能以下图所示,对象分散在老年代各处。web
新生代存活对象从Eden区和survivor区复制到另外一个空闲的survivor区。任何minorGC年龄达到阈值的老对象被升级至老年代。算法
youngGC(minorGC)后,Eden区和一个survivor区被清空。api
新近升级至老年代的对象以深蓝色表示。绿色对象是新生代仍存活的对象。多线程
在初始标记和从新标记阶段发生STW。当老年代剩余空间达到阈值时(发生Concurrent Mode Failure),使用SerialOld替代CMS进行老年代GC。并发
(1)初始标记停顿时间很短,简单的标记GCRoot引用的对象。(2)并发标记在标记存活对象时,应用继续执行。(3)从新标记阶段,标记并发阶段遗漏的存活对象。oracle
未被标记的对象直接被回收。完成并发清扫后,许多老年代空间被释放出来。同时内存整理仍没有发生,老年代存在大量内存碎片。app
最终,CMS通过重置阶段,等待下一次GC。ide
G1收集器将java堆均分红大小相同的区域(region,1M-32M,最多2000个,最大支持堆内存64G)。一个或多个不连续的区域共同组成eden、survivor或old区,但大小再也不固定,这为内存应用提供了极大地弹性。G1垃圾收集过程与CMS相似。G1在堆内存中并发地对全部对象进行标记,决定对象的可达性。通过全局标记,G1了解哪些区域几乎是空的,而后优先收集这些区域,这就是GarbageFirst的命名由来。G1将垃圾收集和内存整理活动专一于那些几乎全是垃圾的区域,并创建停顿预测模型来决定每次GC时回收哪些区域,以知足用户设定的停顿时间。
对于区域的回收经过复制算法实现。在完成标记清理后,G1将这几个区域的存活对象复制到一个单独区域中,实现内存整理和空间释放。这一过程经过多线程并行进行来下降停顿时间,提升吞吐量。经过这样的方式,G1在每次GC过程当中持续清理碎片,控制停顿时间知足用户要求。这时过去虚拟机没法作到的。CMS不清理内存碎片(除非经过虚拟机参数设置,在每次或屡次FullGC后进行整理),ParallelOld进行全堆整理,会致使较长的停顿时间。
G1不是实时垃圾收集器,它会尽可能让停顿时间低于用户设置的停顿时间目标但不能保证必定如此。G1根据历史垃圾收集监测数据来 预测每一个区域的回收时间,而后根据用户设定的目标停顿时间决定每次GC时能够回收哪些区域。G1经过这种方式创建比较精确的区域回收时间预测模型。
G1的设计初衷是为用户提供大内存、低GC停顿时间的应用解决方案。这意味着堆内存6G或更大,停顿时间稳定且少于0.5秒。
若是应用正在使用CMS或ParallelOld且面临如下问题,推荐将应用迁移至G1
注意:若是应用没有上述问题,不须要迁移虚拟机。G1并非最新JDK要求的虚拟机。
存活对象移动到一个或多个survivor区域。若是对象达到晋升年龄,将被移动到老年代区域。
新生代GC总结:
新生代垃圾回收(youngGC)须要STW,全部应用线程须要停顿。
youngGC多线程并行执行。
存活对象复制到新的survivor区或老年代区。
阶段
|
描述
|
说明
|
---|---|---|
初始标记 (Stop the world) |
标记GC Roots直接引用的对象,新生代直接引用的老年代对象。
|
|
并发标记 | 标记堆中全部存活的对象。与用户的应用程序并发执行。 在并发标记阶段,若发现区域对象中的全部对象都是垃圾,那个这个区域会在从新标记阶段被当即回收。 同时,并发标记过程当中,会计算每一个区域的对象活性(区域中存活对象的比例)。 |
|
从新标记 (Stop the world) |
修正并发标记阶段因用户程序继续运行而致使标记发生变更的那一部分标记记录 若是发现彻底没有活对象的region就会将其回收到空闲列表。 |
|
清除 (Stop the world) |
清点和重置阶段。 1)使用marking bitmap统计每一个region被标记为活的对象有多少,统计每一个区域的对象活性(区域中存活对象的比例)。 2)重置Remembered Sets |
|
复制 (Stop the world) |
将存活的对象复制到未使用的region中。 G1选择那些活跃度最低,回收速度最快的区域进行回收。 |
|
Remembered Set(可认为是GC Roots的补充)
每个Region都有一个对应的Remembered Set,里面记录了全部来自外部的引用,这些引用将被认为是GC roots的补充。
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html Getting Started with the G1 Garbage Collector
http://www.javashuo.com/article/p-kixkurda-ka.html Getting Started with the G1 Garbage Collector(中文)
https://www.jianshu.com/p/74dd0ffd4386?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation Java垃圾回收手册(四):垃圾回收算法实现
http://blog.jobbole.com/109170/ 深刻理解Java G1垃圾收集器
http://hllvm.group.iteye.com/group/topic/44381 高级语言虚拟机论坛 [资料] [HotSpot VM] 请教G1算法的原理