7种做用于不一样分代的收集器,若是两个收集器之间存在连线,就说明它们能够搭配使用。java
GC实现目标: 准确、高效、低停顿、空闲内存规整.算法
在评估一个GC时,有几个方面须要关注。数据库
java应用调优通常关注两个指标:响应时间和吞吐量。api
响应时间指的是应用对请求的响应时间,如:多线程
对于专一于最小响应时间的应用,长时间停顿是没法接受的。并发
吞吐量专一于应用在一段时间的的最大工做量。如:app
较长停顿时间在此状况下是能够接受的。比起低响应时间,吞吐量优先应用更看重一段时间内的表现。ide
|
工做区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Serial收集器性能 (Stop the World)网站 |
新生代 | 单线程 | 复制算法 | Client模式下的默认新生代收集器。 进行垃圾收集时,必须Stop the world,直到它收集结束。 -XX:+UseSerialGC |
|
工做区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
ParNew收集器 (Serial收集器的多线程版本) (Stop the World) |
新生代 | 多线程 | 复制算法 | Server模式下的默认新生代收集器 |
|
工做区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Parallel Scavenge收集器 (Stop the World) |
新生代 | 多线程 | 复制算法 | 吞吐量优先收集器 目标:控制吞吐量 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间) 吞吐量越高说明CPU时间利用率越高。 JVM参数: -XX:MaxGCPauseMillis 控制最大垃圾收集时间 -XX:GCTimeRatio 控制吞吐量大小 -XX:+UseParallelGC -XX:+UseParallelOldGC |
|
做用区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Serial Old收集器 (Stop the World) |
老年代 | 单线程 | 标记整理算法 | 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。 若是在Server模式下,主要两大用途: (1)在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用 (2)做为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用 |
|
做用区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Parallel Old收集器 (Stop the World) |
老年代 | 多线程 | 标记整理算法 | Parallel Old 是Parallel Scavenge收集器的老年代版本。这个收集器在1.6中才开始提供。 在JDK1.5以及以前的版本中,Parallel Scavenge+Serial Old(单线程),没法充分利用多CPU的处理能力。1.6以后,终于有了名副其实的“吞吐量优先“收集器组合:Parallel Scavenge + Parallel Old。 |
|
做用区域
|
单线程/多线程
|
垃圾收集器算法
|
|
---|---|---|---|---|
CMS收集器 | 老年代 | 多线程 | 标记-清除算法 | 目标:最短回收停顿时间 优势:并发收集,低停顿 缺点: 1)CPU资源敏感。 在并发阶段,虽然不会致使用于线程停顿。但会由于占用了一部分CPU资源,致使用户应用程序变慢,吞吐量下降。 2)没法处理浮动垃圾 并发清理阶段,用户线程仍旧在运行并产生垃圾,这些产生的垃圾这次收集没法清理。 所以,须要预留一部份内存用于并发清理时用户程序使用。 解决方法: 当预留的内存不够时,将发生Concurrent Mode Failure,JVM启动后备预案,临时启用Serial Old进行老年代垃圾收集 -XX:CMSInitiatingOccupancyFraction 3)内存碎片问题 解决方法: -XX:CMSFullGCsBeforeCompaction 设置执行多少次不带压缩的Full GC后,运行一次带压缩的 (默认为0,表示每次Full GC都进行碎片整理) |
CMS在老年代的整个过程分为4个步骤:
|
阶段
|
描述
|
---|---|---|
1 | 初始标记 (Stop the World) |
仅仅标记GC Roots能直接关联到的对象,速度很快 |
2 | 从新标记 (Stop the World) |
修正并发标记阶段因用户程序继续运行而致使标记发生变更的那一部分标记记录。此阶段比初始标记阶段稍长,但远比并发标记阶段的时间短。 |
3 | 并发标记 | 对GC Roots非直接关联到的对象进行标记,在此阶段,并发标记线程与用户线程并发执行,标记可能发生变更 |
4 | 并发清除 |