GC算法:
- 标记清除算法
扫描对象,并标记出所有需要回收的对象。之后再次扫描,回收所有被标记的对象。
优点:节省空间 缺点:扫描两次,浪费了时间,会产生内存碎片。
- 标记压缩算法(标记整理算法)
优化了标记清除算法,在标记后不是直接清除对象,而是将存活对象移向内存的一端。然后清除需要回收的对象。
-
复制算法
主要用在年轻代中(年轻代中对象存活度较低),每次GC后,都会将Eden区中还存活的对象移到幸存区的To中,幸存区From里面的对象,会判断它经历了几次GC,如果达到设定的值(默认15,可以使用-XX:MaxTenuringThreshold=… 来调整),会被移到老年代,如果没有达到,则复制到To区,经过GC后Eden和From都会被清空。然后From和To的角色交换,保证To区为空,新的From区中对象的年龄都已经加一。
优点:没有内存碎片化问题,吞吐量优秀。缺点:影响堆内存使用效率,浪费了空间。
-
引用计数法–使用较少
通过在对象头中分配一个空间来保存该对象被引用的次数。如果该对象被其它对象引用,则它的引用计数加一,如果删除对该对象的引用,那么它的引用计数就减一,当该对象的引用计数为0时,那么该对象就会被回收。
GC:分代收集算法。年轻代使用复制算法,老年代使用标记清除+标记整理(解决内存碎片)混合实现。