没有任何引用指向的一个对象或者多个对象(循环引用)
部分垃圾回收器使用的模型算法
新生代 = Eden + 2个suvivor区 多线程
PS 年轻代 并行回收
新生代并行回收收集器也是使用复制算法的收集器。从表面上看,它和并行收集器同样都是多线程、独占式的收集器。可是,并行回收收集器有一个重要的特色:它很是关注系统的吞吐量。
在启动参数中指定-XX:+UseParallelGC,会使用Parallel Scavenge(新生代并行回收收集器) + SerialOld的回收器组合
若是使用-XX:+UseParallelOldGC,表示Parallel Scavenge(新生代并行回收收集器)+ Parallel Old(并行回收收集器)并发
Serial回收器的多线程版本,只能用于新生代。使用复制算法,多线程并行工做。在多CPU主机上的性能高于Serial,单CPU主机上的性能低于Serial。
若是使用-XX:+UseParNewGC,表示ParNew(并行收集器)+ Serial Old(串行收集器)ide
Serial收集器的老年版本,独占式,单线程,使用的是标记--整理算法,这个收集器的目的也是用于Client模式下的虚拟机使用。性能
是Parallel Scavenge收集器的老年版本,使用多线程和标记整理算法,注重吞吐量优先,在注重吞吐量和CPU资源铭感的场合,均可以考虑Parallel Scavenge加Parallel Old收集器。spa
算法:三色标记 + Incremental Update
1.初始标记:Stop the world,只标记GC Roots能直接关联到的对象。
2.并发标记:GC Roots Tracing
3.从新标记:Stop the world,修正并发标记期间,因用户程序继续运行致使标记产生变更的那一部分对象的标记记录。
4.并发清除:并发清除能够和用户线程一块儿运行,因此整体上停顿的时间很是短。
可是CMS收集器有三个显著缺点:
1.对CPU资源敏感。
2.没法处理浮动垃圾。
3.收集结束后会产生大量碎片。线程
1.G1的设计原则是"首先收集尽量多的垃圾(Garbage First)"。所以,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具备高收集收益的分区进行收集。同时G1能够根据用户设置的暂停时间目标 自动调全年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
2.G1采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,存活的对象复制到另外一个空闲分区中。因为都是以相等大小的分区为单位进行操做,所以G1自然就是一种压缩方案(局部压缩);
3.G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不须要彻底独立的survivor(to space)堆作复制准备。G1只有逻辑上的分代概念,或者说每一个分区均可能随G1的运行在不一样代之间先后切换;
4.G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),这样即便堆内存很大时,也能够限制收集范围,从而 下降停顿。设计