JVM学习笔记(五)——垃圾收集器

虚拟机之Server/Client

Server

1.启动时较慢。因为此模式下会收集较多的系统性能信息,使用更加复杂的优化算法对程序进行优化;

2.程序启动并进入运行稳定期后,执行速度显著提高;

3.适用于后台长期运行的程序。

Client

1.启动时较快。因为此模式下只会收集较少的系统性能信息;

2.适用于桌面应用程序。

Serial收集器(新生代)

1.单线程收集器,工作时停止其他线程(Stop The World);

2.效率高;

3.停顿时间控制在几十毫秒到一百毫秒之间;

4.适用于Client模式下的虚拟机;

5.可与CMS配合使用。

ParNew收集器(新生代)

1.多线程版的Serial;

2.Server模式下首选的新生代收集器;

3.可与 CMS 和 Serial Old 配合使用。

Parallel Scavenge收集器(新生代)

1.并行的多线程收集器;
2.目标:
    达到一个可控制的吞吐量(Throughput),
    吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间);

相关参数

-XX:MaxGCPauseMillis:参数控制最大垃圾收集停顿时间

-XX:GCTimeRatio:参数设置吞吐量大小

-XX:UseAdaptiveSizePolicy:开关自适应的调节策略参数

自适应的调节策略:不需要手动指定新生代的大小、Eden与Survivor区的比例、晋升老年代对象年龄等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整相关参数。这种调节方式叫自适应的调节策略,

Serial Old收集器(老年代)

1.单线程收集器;

2.适用于Client模式下的虚拟机;

3.Server模式下两大用途:

    a.在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用;

    b.作为CMS收集器的后备方案,在并发收集发生ConCurrent Mode Failure时使用。

Parallel Old收集器(老年代)

1.多线程收集,Parallel Scavenge收集器的老年代版本;

2.适用于注重吞吐量以及CPU资源敏感的场合。

CMS(Concurrent Mark Sweep)收集器

1.以获得最短回收停顿时间为目标;

2.标记 清除 算法

四个步骤

1.初始标记(CMS initial mark)
需要“Stop The World”,
初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;
2.并发标记(CMS concurrent mark)
进行GC Roots Tracing的过程
3.重新标记(CMS remark)
为了修正并发标记期间用用户程序继续运作而导致标记产生的那一部分对象的标记记录。
这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记时间短。
4.并发清除(CMS concurrent sweep)
由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,总体上来说整个过程可以看成是与用户线程并发的。

缺点

并发阶段,它会占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。

CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
由于CMS并发清理阶段用户线程还在运行着,伴随着程序运行自然就还会有新的垃圾不断产生,这部分垃圾出现在标记过程之后,CMS无法在当次收集中处理它们,只好留待在下一次GC时再清理掉,这一部分垃圾就称为“浮动垃圾”。

CMS是一款基于“标记-清除”算法实现的收集器,这意味着收集结束时会有大量的空间碎片产生。
-XX:+UseCMSCompactAtFullColletion开关参数(默认是开启的),用于在CMS收集器顶不住要进行Full GC时开启内存碎片合并整理过程,内存整理的过程是无法并发的,但停顿的时间不得不变长了。
-XX:CMSFullGCsBeforeCompaction,这个参数是用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值为0,表示每次进入Full GC时都进行碎片整理)。

你可能感兴趣的:(JVM)