1. 标记-清除算法
标记清除 是最基础的垃圾收集算法,因为后续的所有gc算法都是基于此进行的改进。
特点:
分为标记和收集2个阶段,首先标记处需要回收的对象,然后统一回收
不足:
效率问题,空间碎片,当分配大对象时会因为没有足够的连续内存空间二导致提前出发gc
2. 复制收集算法
将可用内存分为大小相等的2份,每次只是用其中的一块,当这块内存用完,就将活着的对象赋值到另一块空间,
然后将是用过的内存空间清理掉。
特点:
简单,运行高晓晓
不足: 将内存空间缩小为原来的一半,代价有些高。
3. 标记-整理算法
复制收集算法在对象存活率较高时候就要进行多次复制,效率低。
老年代采用了标记清除算法,把存活的对象都向一端移动,然后清理掉其他内存
4. 分代收集算法
当前商用虚拟机大多采用分代收集的算法。
根据对象存活的手气不同,将内存划分为新生代和老年代,然后根据不同区域采用不同收集算法。
新生代:
每次收集都会有大批对象死去,采用复制算法,只需要少量对象复制的成本就可以完成收集。
老年代:
对象存活率高,采用标记-清理或者标记-整理算法
5. minor 和 major gc
新生代gc (minor gc) :
java对象大多朝生夕死,所以minor gc会很频繁,回收速度也快
老年代gc (major gc) :
一次 major gc 通常伴随着至少一次的minor gc
大对象和长期存活的对象直接进入老年代
每次gc都会讲对象头中的age + 1,一般最大为15就会进入老年代