分代收集理论
分代收集理论是多个收集器的设计原则,它的具体内容是
-
弱分代假说:大多数对象朝生夕灭,弹指一挥间,人生短暂
-
强分代假说:熬过GC次数愈多的对象,在GC的过程中越难被消亡
-
跨代引用假说:存在跨代引用的对象是非常少数的
如果新生代的对象被老年代所引用,而jvm要进行 minorGC, 这时就不得不在固定的GCroot之外,再遍历所有的老年代对象来保障 ,这样会大大的降低GC的效率。所以可以在新生代中使用 RememberSet来 存储老年代中存在跨代引用的内存,在minor时只需要通过RememberSet中 的记录来对指定内存进行检查即可。
所有的一切都是为了提高效率,顾客真是上帝呀!收集器将堆分为不同的区域来存放不同分代年龄的对象(对象经历GC后存活下来的次数越多,年龄越大)。试想如果一块内存区域(新生代)存放那些朝生夕灭的对象,以较高的频率GC,而且每次GC时只需要标记那些少数存活的对象。将那些难以消亡的对象放在另一块区域(老年代),以较低的频率GC,那么这将大大改善GC的时间开销和空间的有校利用。每次在新生代GC后存活的对象会逐步升级到老年代
根据分代的GC类型
- minor GC:只对新生代的GC
- major GC:只对老年代的GC
- Full GC:对整个堆的GC
- Mixed gc:对新生代和部分老年代的GC
新生代的内存分配
- Eden空间
- From 空间
- To 空间:from ,to 均是survivor区域
Eden 和 survivor的比例是 8:1,每次只使用eden和一个survivor(from),所有的对象主要在eden中分配内存。当GC时Eden中存活的对象将被复制到to survivor区域,而from survivor区域则根据对象的年龄决定复制到老年代还是to survivor,一般当 年龄达到 15则复制到老年代。然后清空 eden和from区,from 和 to交换身份。这样保障了一次GC后 Eden和to区总是空的。当to区被填满后,所有的对象会进入到老年代
分配担保:当to survivor不足以容纳一次GC后eden和from中存活的对象,
通过分配担保,对象直接进入老年代