回收算法
1、标记清除
第一步,先对没有 GC Root 对象直接或间接引用的对象进行一个标记。
第二步,对标记的对象进行清除,并不是清零操作,而是将该区域内存的起始、截止地址放入一个空闲区域地址列表内,即可被重复利用。需要利用内存时就在空闲地址列表内使用即可。
优点:仅记录起始、截止地址,故而速度快。
缺点:记录的空间不连续,容易产生内存碎片。
2、标记整理
优点:无内存碎片,都是连续内存,有利于存储较大的对象。
缺点:牵扯内存移动,效率较低,速度慢
3、复制
第一步:将没有被 GC Root 直接或间接引用的对象进行一次垃圾标记。
第二步:将非垃圾对象整理到 TO 内存区内。
第三步:直接清除 FROM 内存区内的所有垃圾内存。
第四步:将 FROM 内存区和 TO 内存区进行交换,保证TO内存区始终为空闲空间。
优点:无内存碎片,效率相对较高。
缺点:需要双倍的内存空间。
分带垃圾回收
第一步:对象将会优先加入到新生代的伊甸园内存区中。
第二步:伊甸园占满了,触发 Minor GC 将伊甸园内有 GC Root 对象直接或间接引用的对象加入到幸存区 To 内并将该对象的寿命加一,后将伊甸园内的垃圾内存回收。
第三步:将幸存区 From 和幸存区 To 进行交换,保证幸存区 To 始终为空闲内存空间。
第四步:伊甸园又满了,触发第二次Minor GC 将伊甸园内有 GC Root 对象直接或间接引用的对象、幸存区 From 内非垃圾对象加入到幸存区 To 内并将该对象的寿命加一,后将伊甸园内的垃圾内存回收。
第五步:若在幸存区 From 的对象寿命达到 15 证明该对象价值较高,存储到老年代内。
第六步:当全部的内存代都已填满的时候,将触发一次 Full GC 清理全部内存代内的非 GC Root 对象直接或间接引用的对象。