堆详细讲解
几个要点:
第一,堆区分了新生代和老年代;
第二,新生代又分为:Eden空间、From Survivor(S0)空间、To Survivor(S1)空间。
第三,堆的GC操作采用分代收集算法。新生代采用复制算法,老年代采用标记整理算法
在GC回收过程中,当新生代区满时,还存活的对象会被复制到其中一个Survivor区;当回收时,会将新生代区和使用的Survivor区还存活的对象,复制到另外一个Survivor区,然后对新生代区和用过的Survivor区进行清理。
如果另外一个Survivor区没有足够的内存存储时,则会进入老年代。
这里针对哪些对象会进入老年代有这样的机制:对象每经历一次复制,年龄加1,达到晋升年龄阈值后,转移到老年代。
在这整个过程中,由于新生代区中的对象属于像浮萍一样“瞬生瞬灭”的对象,所以并不需要1:1的比例来分配内存,而是采用了8:1:1的比例来分配。
历经多次清理依旧存活的对象,则会进入老年代,而老年代清理算法则采用的“标记整理算法”。