jvm 垃圾收集算法

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就会进入老年代