捂脸斋

江山风月 🌘 本无常主 🌈 闲者便是主人 🍃🍃🍃

G1 VS ParallelGC 性能对比

准备这些命令

1
2
3
4
5
6
# 查看堆状态和选择的垃圾收集器
jmap -heap <pid>

# 手动执行FGC
jcmd <pid> GC.run

使用G1收集器

1
java -XX:+UseG1GC -jar demo.jar

初始状态

压测场景A,单线程循环创建对象,持续600s

程序执行到43s时,抛出了OutOfMemoryError: Java heap space,过程终结。
此过程的CPU负载如下图。

压测场景B,4线程循环创建对象,持续600s

约11min后,CPU负载稳定在0.1%,没有新的GC,4个线程都没有抛出OOM。
此过程的CPU负载如下图。

小结

单线程创建对象,一段时候后,会抛出OOM。
多线程创建对象,不会抛出OOM。
两种场景下,CPU负载都维持在比较低的水平。

使用ParallelGC收集器

初始状态

####压测场景A,单线程循环创建对象,持续600s
约11min后,CPU负载稳定在0.1%,没有新的GC,没有抛出OOM。
此过程CPU负载几乎100%,没有采样。
此过程的GC采样。

GC总消耗:
| YGC | YGCT | FGC | FGCT | GCT
| 26 | 3.797 | 156 | 649.261 | 653.058

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
// seconds = 600, threadCount = 1
public static void boostMem(int seconds, int threadCount) {
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
List<Object> objects = new ArrayList<>();
LocalDateTime endTime = LocalDateTime.now().plusSeconds(seconds);
while (LocalDateTime.now().isBefore(endTime)) {
objects.add(new Object());
}
}).start();
}
}

附件

G1-4-threads.log

G1-1-thread.log

g1-cpu负载.numbers

parallelgc-gc采样.numbers