垃圾回收
模型图
回收原则
分代分配,分代回收
区域特点
年轻代 Young Generation
概述
大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区(进行轮询,不超过15次,必定有一个保持空的状态)。之后还没有回收的被复制到老年代中
Minor GC ,Young GC
Minor GC发生在新生代,当Eden区没有足够空间时,会发起一次Minor GC,将Eden区中的存活对象移至Survivor区。
所有新生成的对象首先都是放在年轻代的。尽可能快速的收集掉那些生命周期短的对象。
收集器
Serial收集器:复制算法,使用一个线程进行GC,串行,其它工作线程暂停。
ParNew收集器:复制算法,Serial收集器的多线程版,用多个线程进行GC,并行,其它工作线程暂停。
Parallel Scavenge 收集器:吞吐量优先的垃圾回收器,复制算法,关注CPU吞吐量
老年代 Old Generation
概述
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。 可认为大都是生命周期较长的对象。
Major GC,Full GC
Major GC发生在老年代,发生Major GC时用户线程会暂停,会降低系统性能和吞吐量。
在所有用户线程停止的情况下完成回收。很影响应用的性能,要尽量避免或减少
收集器
串行垃圾回收器 Serial Old收集器:标记整理算法,单线程收集器,串行,使用单线程进行GC,其它工作线程暂停。
并行垃圾回收器 Parallel Old收集器:标记整理算法,多线程并行,在内存充足以及多核的情况下会很有用,需要暂停其它线程。
并发标记扫描垃圾回收器 CMS收集器:标记清除算法,多线程,优点是并发收集(用户线程可以和GC线程同时工作),停顿小。
永久代Permanent Generation,粗略的认为是方法区
用于存放静态常量,类文件信息,相当于方法区
算法
复制算法
把内存空间划为两个区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。
优点:每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。
缺点:会浪费一定的内存。一般新生代采用这种算法。
标记清除算法
标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
缺点是效率不高并且会产生不连续的内存碎片。
标记整理算法
标记和清除两个阶段:先标记出所有需要回收的对象,然后让所有存活对象都想一端移动,进行清理
不建议程序调用垃圾回收
并发垃圾回收器可以在用户线程运行的情况下完成大部分的回收工作,所以应用停顿时间很短。