JVM之内存回收策略(二)
1.概述
前面回答了内存应该回收哪些对象。还有两个问题没有解决,内存怎么回收?内存何时回收?
2.标记-清除算法
标记-清除算法是最基础的垃圾回收方法。它的基本思想是:把垃圾都标记出来,然后统一回收。
优点:实现简单。
缺点:在空间上面,标记-清除之后的内存是碎片化的,对于给大对象分配内存时内存不足,提前进行一次垃圾回收。在时间上,标记和清除的效率都很低。
3.复制算法
复制算法就是解决效率问题的方法。它把空闲内存容量划分为两块相等的空间,每次只使用其中的一块。当使用的这一块用完了,就将还存活的对象复制到另一块上面,然后再把已用的内存一次清理掉。这样每次只对一半的内存清理,也不会出现碎片化现象。
优点:实现简单(只需移动指针即可)
缺点:将内存缩小为原来的一半,代价大。
4.标记-整理算法
标记-整理算法思想跟标记-清除算法的标记过程一样,只不过在标记之后让存活的对象向内存空间的一端移动。最后只需要清除存活对象边界以外的内存。
5.分代收集算法
根据对象存活周期,把内存划分为几块。一般是把堆内存划分为新生代和老年代。新生代的对象存活率低就使用复制算法,老年代对象存活率高,就是用标记-清除算法或者标记-整理算法。
6.垃圾收集器
Serial收集器、Serial Old收集器:单线程收集器,在执行垃圾回收的时候暂停所有的用户线程,Seral Old收集器是Serial收集器的老年代版本。新生代采用复制算法,老年代采用标记整理算法。
ParNew收集器:Serial收集器的多线程版本。
Parallel Scavenge收集器:新生代收集器,使用复制算法,跟ParNew收集器一样是多线程。关注点在于提高用户线程在CPU运行的时间比值。
CMS收集器:一种以获取最短回收停顿时间为目标的收集器。并发执行。