一?点睛
如果说 SerialGC 是年轻代中的单线程垃圾收集器,那么 ParNew 收集器则是 Serial 收集器的多线程版本。
Par 是 Parallel 的缩写,New:只能处理新生代
ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何区别。ParNew 收集器在年轻代中同样也是采用复制算法、 "stop-the-World" 机制。
ParNew 是很多 JVM 运行在 Server 模式下新生代的默认垃圾收集器。

由于 ParNew 收集器是基于并行回收,那么是否可以断定 ParNew 收集器的回收效率在任何场景下都会比 Serial 收集器更高效?
除 Serial 外,目前只有 ParNew GC 能与 CMS收集器配合工作。
二?参数配置
在程序中,开发人员可以通过选项"-XX:+UseParNewGC"手动指定使用 ParNew 收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代。
-XX:ParallelGCThreads 限制线程数量,默认开启和 CPU?核数相同的线程数。
三?实战
1?代码
/**
* -XX:+PrintCommandLineFlags
* -XX:+UseParNewGC:表明新生代使用ParNew GC
*/
public class GCUseTest {
public static void main(String[] args) {
ArrayList<byte[]> list = new ArrayList<>();
while (true) {
byte[] arr = new byte[100];
list.add(arr);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2?测试
a 使用?-XX:+PrintCommandLineFlags -XX:+UseParNewGC?进行测试
在JDK 9的情况下会报错
D:\ProgramFiles\Java\jdk-9\bin\java.exe -XX:+PrintCommandLineFlags -XX:+UseParNewGC -javaagent:D:\ProgramFiles\JetBrains\IDEA\lib\idea_rt.jar=52919:D:\ProgramFiles\JetBrains\IDEA\bin -Dfile.encoding=UTF-8 -classpath E:\JVMDemo\out\production\chapter17 com.atguigu.java.GCUseTest
OpenJDK 64-Bit Server VM warning: Option UseParNewGC was deprecated in version 9.0 and will likely be removed in a future release.
It is not possible to combine the ParNew young collector with any collector other than CMS.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
在JDK 8下测试结果如下
D:\ProgramFiles\Java\jdk1.8.0_251\bin\java.exe -XX:+PrintCommandLineFlags -XX:+UseParNewGC -javaagent:D:\ProgramFiles\JetBrains\IDEA\lib\idea_rt.jar=53065:D:\ProgramFiles\JetBrains\IDEA\bin -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\Java\jdk1.8.0_251\lib\ant-javafx.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\dt.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\javafx-mx.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\jconsole.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\packager.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\sa-jdi.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\tools.jar;E:\JVMDemo\out\production\chapter17 com.atguigu.java.GCUseTest
-XX:InitialHeapSize=250603712 -XX:MaxHeapSize=4009659392 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC
在命令行下测试(JDK 8下使用组合UseParNewGC + UseSerialOldGC)
E:\JVMDemo>jps
2384
5300 Jps
12120 RemoteMavenServer36
1800 GCUseTest
536 Launcher
E:\JVMDemo>jinfo -flag UseSerialOldGC 1800
no such flag 'UseSerialOldGC'
E:\JVMDemo>jinfo -flag UseConcMarkSweepGC 1800
-XX:-UseConcMarkSweepGC
b?使用?-XX:+PrintCommandLineFlags -XX:+UseParNewGC -XX:+UseConcMarkSweepGC?进行测试
在?JDK8的情况下测试结果为
D:\ProgramFiles\Java\jdk1.8.0_251\bin\java.exe -XX:+PrintCommandLineFlags -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -javaagent:D:\ProgramFiles\JetBrains\IDEA\lib\idea_rt.jar=53432:D:\ProgramFiles\JetBrains\IDEA\bin -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\Java\jdk1.8.0_251\lib\ant-javafx.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\dt.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\javafx-mx.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\jconsole.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\packager.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\sa-jdi.jar;D:\ProgramFiles\Java\jdk1.8.0_251\lib\tools.jar;E:\JVMDemo\out\production\chapter17 com.atguigu.java.GCUseTest
-XX:InitialHeapSize=250603712 -XX:MaxHeapSize=4009659392 -XX:MaxNewSize=697933824 -XX:MaxTenuringThreshold=6 -XX:OldPLABSize=16 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC
在?JDK9的情况下进行测试
D:\ProgramFiles\Java\jdk-9\bin\java.exe -XX:+PrintCommandLineFlags -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -javaagent:D:\ProgramFiles\JetBrains\IDEA\lib\idea_rt.jar=53633:D:\ProgramFiles\JetBrains\IDEA\bin -Dfile.encoding=UTF-8 -classpath E:\JVMDemo\out\production\chapter17 com.atguigu.java.GCUseTest
-XX:InitialHeapSize=250603712 -XX:MaxHeapSize=4009659392 -XX:MaxNewSize=697933824 -XX:MaxTenuringThreshold=6 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC
OpenJDK 64-Bit Server VM warning: Option UseParNewGC was deprecated in version 9.0 and will likely be removed in a future release.
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
|