标记清除算法
将垃圾回收分为两个阶段:标记阶段
和清除阶段
。
标记阶段
:首先经过根节点,标记全部从根节点开始的可达对象。未被标记的对象就是未被引用的垃圾对象。
清除阶段
:清除全部未被标记的对象。
标记清除算法
可能产生的最大问题是空间碎片
。
注意:标记清除算法先经过根节点标记全部可达对象,而后清除全部不可达对象,完成垃圾回收。算法
eden ===> from to,就是使用的复制算法
优势:不会产生碎片
缺点:浪费空间多线程
标记压缩算法是一种老年代的回收算法。并发
新生代能够用复制算法。
老年代可使用标记-清除算法
或标记-整理算法
。jvm
串行回收器是指使用单线程进行垃圾回收的回收器。性能
串行回收器
主要有两个特色:线程
单线程
进行垃圾回收独占式
的垃圾回收在串行收集器进行垃圾回收时,Java应用程序中的线程都须要暂停,等待垃圾回收的完成。这种现象称之为Stop-The-World
。在实时性要求较高的应用场景中,这种现象每每是不能被接受的。code
新生代串行处理器使用复制算法
。对象
使用-XX:+UseSerialGC
参数能够指定使用新生代串行收集器和老年代串行收集器。内存
老年代串行收集器使用的是标记压缩算法
。和新生代串行收集器同样,它也是一个串行的、独占式的垃圾回收器。工作流
若是要启动老年代串行回收器,能够尝试使用如下参数:
它只是在串行回收器上作了改进,使用多个线程同时进行垃圾回收。
它是独占式
的。
在并发能力比较强的CPU上,它产生的停顿时间要短于串行回收器,而在单CPU或者并发能力较弱的系统中,并行回收器的效果不会比串行回收器好,因为多线程的压力,它的实际表现极可能比串并回收器差。
启动新生代ParNew回收器:
ParNew回收器的线程数量能够经过-XX:ParallelGCThreads参数指定。
新生代ParallelGC回收器关注系统吞吐量,使用复制算法
。
启动新生代ParallelGC回收器:
ParallelGC回收器提供了两个重要的参数用于控制系统的吞吐量:
这是它与ParNew回收器的一个不一样之处,另一个不一样之处是它还支持一种自适应的GC调整策略。使用-XX:+UseAdaptiveSizePolicy
能够打开自适应GC策略。
老年代ParallelOldGC回收器也是一种多线程并行的收集器。它也是一种关注吞吐量的收集器。它使用标记压缩算法
,它在JDK1.6中才可使用。
使用-XX:+UseParallelOldGC
能够在新生代使用ParallelGC回收器,老年代使用ParallelOldGC回收器。参数-XX:ParallelGCThreads
也能够用于设置垃圾回收时的线程数量。
它是非独占的。
与ParallelGC
和ParallelOldGC
不一样,CMS回收器主要关注于系统停顿时间
。CMS是Concurrent Mark Sweep的缩写,意为并发标记清除,从名称上就能够得知,它使用的是标记清除算法,同时它又是一个使用多线程并行回收的垃圾回收器。
ParNewGC
)注意:
并发
是指收集器和应用线程交替执行。
并行
是指应用程序中止,同时由多个线程一块儿执行GC。
所以并行回收器不是并发的,由于并行回收器执行时,应用程序彻底挂起,不存在交替执行的步骤。CMS回收器是一个关注停顿的垃圾收集器。同时CMS回收器在部分工做流程中,能够与用户程序同时运行,从而下降应用程序的停顿时间。
在使用CMS回收器时,若是须要回收Perm区,那么默认状况下,仍是须要触发一次Full GC的。若是但愿使用CMS回收Perm区,则必需要打开-XX:+CMSClassUnloadingEnabled
开关,若是条件容许,那么系统会使用CMS的机制回收Perm区Class数据。
G1回收器是在JDK1.7中正式使用的全新垃圾回收器,从长期目标来看,它是为了取代CMS回收器。
从分代上看,G1依然属于分代垃圾回收器
,它会区分年轻代
和老年代
,依然有eden区和survivor区,但从堆的结构上看,它并不要求整个eden区,年轻代或者老年代都连续。它使用了分区算法
。
做为CMS的长期替代方案,G1同时使用了全新的分区算法,其特色以下:
G1的手机过程可能有4个阶段: