G1的年轻代
堆空间被分割成大约2000个区域。最小1M,最大32M,蓝色区域保持年老代对象,绿色区域保持年轻代对象。
注意:区域没有必要像旧的收集器一样是保持连续的。
G1的年轻代收集
活跃对象会被疏散(复制、移动)到一个或多个survivor区域。如果达到晋升总阈值,对象会晋升到年老代区域。
这是一个stop the world暂停。为下一次年轻代垃圾回收计算Eden和Survivor的大小。保留审计信息有助于计算大小。类似目标暂停时间的事情会被考虑在内。
这个方法使重调区域大小变得很容易,按需把它们调大或调小。
G1年轻代回收的尾声
活跃对象被疏散到Survivor或者年老代区域
最近晋升的对象显示为深蓝色。Survivor区域显示为绿色。
关于G1的年轻代回收做以下总结:
堆空间是一块单独的内存空间被分割成多个区域。
年轻代内存是由一组非连续的区域组成。这使得需要重调大小变得容易。
年轻代垃圾回收是stop the world事件,所有应用线程都会因此操作暂停。
年轻代垃圾收集使用多线程并行回收。
活跃对象被复制到新的Survivor区或者年老代区域。
G1年老代垃圾回收:
类似CMS收集器,G1收集器为年老代对象被设计成一个低暂停收集器。下面的表描述了在年老代上的G1收集阶段。
G1垃圾收集器在堆上的年老代执行以下阶段。注意一些阶段是年轻代回收的一部分。
初始标记阶段:
年轻代垃圾收集肩负着活跃对象初始标记的任务。在日志文件中被标为GC pause (young)(inital-mark)
并发标记阶段:
如果发现空区域(“X”标示的),在重新标记阶段它们会被马上清除掉。当然,决定活性的审计信息也在此时被计算。
重新标记阶段:
空的区域被清除和回收掉。所有区域的活性在此时计算。
复制/清理阶段:
G1选择活性最低的区域,这些区域能够以最快的速度回收。然后这些区域会在年轻代垃圾回收过程中被回收。在日志中被指示为[GC pause (mixed)]。所以年轻代和年老代在同一时间被回收。
复制/清理阶段之后:
被选择的区域已经被回收和压缩到图中显示的深蓝色区和深绿色区中。
年老代垃圾回收总结:
总结下,我们可以列出一些关于G1收集器在年老代的上关键点。
并发标记阶段
当应用运行时,并发的计算活性信
在疏散暂停期间,活性信息鉴定哪些区被最好的回收
没有像CMS一样的清除操作
重新标记阶段
使用比在CMS中使用的算法更快的Snapshot-at-the-Beginning(SATB)算法
完全空的区域会被回收掉
复制/清理阶段
年轻代和年老代被同时回收
年老代区域基于它们的活性被选择