JVM-透彻掌握Parallel垃圾回收器的使用方法

Parallel概述 HotSpot的年轻代中除了拥有ParNew收集器是基于并⾏回收的以外,Parallel Scavenge收集器同样也采⽤了复制 算法、并⾏回收和"Stop the World"机制。

那么Parallel 收集器的出现是否多此⼀举?

和ParNew收集器不同,Parallel Scavenge收集器的⽬标则是达到⼀个可控制的吞吐量,它也被称为吞吐量优先的 垃圾收集器。简单来说就是:

不管执⾏多少次,也不管每次执⾏多少时间,但是要在⼀定的时间范围⾥ ,尽可能让线程执⾏⽤户程序 ⾼吞吐量则可以⾼效率地利⽤CPU时间,尽快完成程序的运算任务,主要适合在后台运算⽽不需要太多交互的任 务。因此,常⻅在服务器环境中使⽤。例如,那些执⾏批量处理、订单处理、⼯资⽀付、科学计算的应⽤程序。

Parallel的第⼆个优势是⾃适应调节策略,也是Parallel Scavenge与ParNew⼀个重要区别,基本含义就是⽤户可以 设定垃圾回收的最⼤停顿时间。这⼀点在G1⾥得到充分发扬,性能和效果也更好。

Parallel收集器在JDK1.6时提供了⽤于执⾏⽼年代垃圾收集的Parallel old收集器,⽤来代替⽼年代的serial old收集器。

Parallel old收集器采⽤了标记-压缩算法,但同样也是基于并⾏回收和"stop-the-World"机制。

在程序吞吐量优先的应⽤场景中,Parallel收集器和Parallel old收集器的组合,在server模式下的内存回收性能很 不错。在Java8中,默认是此垃圾收集器 => 【Parallel Scavenge / Parallel old】

代码:

java 复制代码
public class ParallGC {
 private static int size = 1024 * 256;
 public static void main(String[] args) {
 for (int i = 0; i < 33; i++) {
 byte[] allo = new byte[size];
 }
 }
}

JVM参数:

java 复制代码
-Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8

⽇志:

bash 复制代码
0.093: [GC (Allocation Failure) [PSYoungGen: 8103K->528K(9216K)] 8103K->536K(19456K),
0.0008041 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
 PSYoungGen total 9216K, used 2900K [0x00000007bf600000, 0x00000007c0000000,
0x00000007c0000000)
 eden space 8192K, 28% used [0x00000007bf600000,0x00000007bf851260,0x00000007bfe00000)
 from space 1024K, 51% used [0x00000007bfe00000,0x00000007bfe84010,0x00000007bff00000)
 to space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
 ParOldGen total 10240K, used 8K [0x00000007bec00000, 0x00000007bf600000,
0x00000007bf600000)
 object space 10240K, 0% used
[0x00000007bec00000,0x00000007bec02000,0x00000007bf600000)
 Metaspace used 3040K, capacity 4496K, committed 4864K, reserved 1056768K
 class space used 332K, capacity 388K, committed 512K, reserved 1048576K

常⻅参数配置

-XX:+UseParallelGC ⼿动指定年轻代使⽤Parallel并⾏收集器执⾏内存回收任务,默认jdk8是开启的。

-XX:+UseParalleloldGC ⼿动指定⽼年代使⽤并⾏回收收集器。默认jdk8是开启的。与-XX:+UseParallelGC互相激活,只要开启⼀个,另 外⼀个就⾃动开启。

-XX:ParallelGCThreads 设置年轻代并⾏收集器的线程数。⼀般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能。 在默认情况下,当CPU数量⼩于8个,ParallelGCThreads的值等于CPU数量。当CPU数量⼤于8个, ParallelGCThreads的值等于3 + [ 5 * CPU数量] / 8 ]。

-XX:MaxGCPauseMillis 设置垃圾收集器最⼤停顿时间(即STW的时间),单位是毫秒。 为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在⼯作时会调整Java堆⼤⼩或者其他⼀些参数。 对于⽤户来讲,停顿时间越短体验越好。但是在服务器端,我们注重⾼并发,整体的吞吐量。所以服务器端适合 Parallel,进⾏控制。该参数使⽤需谨慎。

-XX:GCTimeRatio,指定垃圾收集时间占总时间的⽐例(=1 /(N + 1)),⽤于衡量吞吐量的⼤⼩。取值范围 (0,100)。默认值99,也就是垃圾回收时间不超过1。与前⼀个-XX:MaxGCPauseMillis参数有⼀定⽭盾性。暂停 时间越⻓,Radio参数就容易超过设定的⽐例。

-XX:+UseAdaptiveSizePolicy 设置Parallel scavenge收集器是否开启⾃适应调节策略。在这种模式下,年轻代的⼤ ⼩、Eden和Survivor的⽐例、晋升⽼年代的对象年龄等参数会被⾃动调整,已达到在堆⼤⼩、吞吐量和停顿时间之 间的平衡点。

在⼿动调优⽐较困难的场合,可以直接使⽤这种⾃适应的⽅式,仅指定虚拟机的最⼤堆、⽬标的吞吐量 (GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机⾃⼰完成调优⼯作。

相关推荐
float_六七1 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天2 小时前
JAVA stream().flatMap()
java·windows
颜如玉3 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员爱钓鱼4 小时前
Go语言实战案例 — 工具开发篇:实现一个图片批量压缩工具
后端·google·go
程序员的世界你不懂4 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年4 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152875 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草5 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6925 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea5 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程