【JVM系列】Serial的年轻代分身——ParNew收集器

97 阅读5分钟

【JVM系列】Serial的年轻代分身——ParNew收集器

欢迎关注,分享更多原创技术内容~

微信公众号:ByteRaccoon、知乎:一只大狸花啊、稀土掘金:浣熊say

微信公众号海量Java、数字孪生、工业互联网电子书免费送~

什么是ParNew垃圾回收器?

在Java中,ParNew是一种用于新生代的并行垃圾回收器,它通常与CMS(Concurrent Mark-Sweep)垃圾回收器一起使用,用于处理新生代的垃圾回收。

实际上,ParNew就是Serial收集器的多线程版本,除了使用的是多线程之外,控制参数、复制算法、Stop The World、对象分配规则和回收策略等等都和Serial收集器一致,两者共用了很多代码。

其运行的原理和Serial垃圾回收器一样,先暂停所有的工作线程并将工作线程的状态全部保存到SafePoint当中,再以多线程的方式对垃圾进行标记和清理操作,完成之后工作线程再从SafePoint恢复工作状态。

在多CPU的情况下,由于多线程的原因性能一般会比Serial收集器性能更好,但是在单CPU的情况下,由于线程间的频繁切换,因此性能一般会更差。

默认情况下,ParNew的垃圾回收线程数目和CPU的核心数目相同,这个线程数目一般不需要手动调节。

启动和JVM参数设置

启动Java应用程序时,你可以通过在命令行中使用java命令来设置JVM参数。以下是一个包含ParNew垃圾回收器相关参数的简单启动命令的示例:

java -XX:+UseParNewGC -XX:MaxGCPauseMillis=200 -XX:GCTimeRatio=4 -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:TargetSurvivorRatio=50 -jar YourApplication.jar

在这个例子中,YourApplication.jar是你的Java应用程序的JAR文件。以下是一些启动ParNew垃圾回收器以及相关参数设置的示例:

参数描述
-XX:+UseParNewGC启用ParNew垃圾回收器。
-XX:MaxGCPauseMillis=<max-pause-time>设置期望的最大垃圾回收暂停时间,单位是毫秒。
-XX:GCTimeRatio=<gc-time-ratio>设置吞吐量目标的垃圾回收时间比率。
-XX:NewRatio=<new-ratio>设置新生代与老年代堆大小的比例。默认值是2,表示新生代占整个堆的1/3。
-XX:SurvivorRatio=<survivor-ratio>设置Eden区与Survivor区的大小比例。默认值是8,表示Eden占整个新生代的8/10。
-XX:MaxTenuringThreshold=<threshold>设置对象晋升到老年代的最大年龄。默认值是15。
-XX:TargetSurvivorRatio=<target-ratio>设置Survivor区目标使用率。

这只是一些可能的参数设置示例,实际应用中根据具体情况可能需要进行调整。你可以根据应用的性能需求和硬件配置来选择适当的参数值。

总结

ParNew垃圾回收器算是一种比较低调的垃圾回收器,就是Serial垃圾回收器的多线程版本,主要用来配合CMS垃圾回收器进行使用。随着JDK 9 之后CMS垃圾回收器被标记为废弃,未来ParNew垃圾回收器使用的场景会越来越少,取而代之的将是G1、ZGC等更为高效的垃圾回收器。但是,由于目前很多项目依旧使用JDK 8,所以对于我们来说还是需要作一定程度上的了解。