【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,所以对于我们来说还是需要作一定程度上的了解。