Serial GC 介绍
串行GC是hotspot中最简单的一种GC, 不过麻雀虽小, 五脏俱全. 除了速度相较其他几种GC比较慢之外, 完成的功能是一样的: 回收不再使用的对象, 为新的对象分配空间. 从简单的情况下手, 我们可以撇去很多边边角角的细节, 从而更好的接近事物的本质, 对于研究GC, 道理也是如此.
Serial GC 的内存分布
Serial GC的heap采用的是分代分布, 默认情况下, 年轻代与老年代的大小之比为1:2, 更细节的布局如下图:
从上图中可以看到, 总体上heap分为年轻代(YoungGen)和老年代(OldGen)两个大块. 而在年轻代中, 又进一步划分成两个部分: Eden Space和两块Survivor Space(存活区), S1和S2. 默认情况下, Eden区和Survivor区(S1 + S2)的比例为8:2. 存活区用于存放那些在年轻代GC中没有被回收, 但是GC年龄没有达到老年代阈值的对象, 简单来说就是一块通向老年代的过渡区. 每次年轻代GC中存活下来的对象, GC年龄将加1, 当达到年龄要求(默认15), 则将该对象移动到老年代中. 之所以有两块, 主要是方便对象的回收和分配, 在年轻代GC中, 其中的一块将扮演From的角色, 一块扮演To的角色, 并且每次GC后, 这两个角色是互相交换的. To区用来保存本次GC中从Eden区中和From区(第一次GC时, From是空的)中存活下来的对象, 然后Eden区和From区清空, 下一次GC中, 清空的From区成为To区, To区成为From区. 更多细节将在后面介绍.
分代收集策略
针对年轻代和老年代, Serial GC分别采用了不同的策略. 在