1、引用计数算法(JVM基本不用)
每个对象都占用一个计数器,每用一次,计数器加一,计数器为0的清除。
2、复制算法(一般在新生区使用)
注意:因为from和to会进行交换,所以哪个为空那个就是to区
在伊甸园区不断生成对象,当满了的时候会出发轻GC,将存活的对象从伊甸园区复制到幸存from区,然后清空伊甸园区,在幸存from区满了后会将伊甸园区和幸存from区都复制到幸存to区,然后清空伊甸园区和幸存from区,这时候就把有对象的to区当作from区(保证to区一直为空),如果一个对象经历了15次GC(默认,可修改:-XX:MaxTenuringThreshold=个数),就可以进入到老年区。
内存碎片:被清除的对象所占用的空间
好处:没有内存碎片(避免了对象放不下的情况产生)
坏处:浪费了一半空间,有一半永远是空的
使用场景:对象存活率低的地方
3、标记清除算法
优点:不需要额外的空间
缺点:两次扫描,严重浪费时间,会产生内存碎片
4、标记压缩算法(老年代使用)
优化了标记清除算法
三部曲:标记,清除.压缩
总结
内存效率(时间复杂度):复制算法>标记清除算法>标记压缩算法
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
没有最好的算法,只有最合适的算法====》GC:分带收集算法
年轻代:(轻GC:Minor GC)
存活率低===》复制算法
老年代:(重GC:Full GC)
区域大:存活率
标记清除(内存碎片不是太多)+标记压缩混合实现