【发布时间】:2018-02-16 13:24:22
【问题描述】:
来自doc 中的选择收集器一章:
如果应用程序的数据集很小(最多大约 100 MB),则选择带有选项 -XX:+UseSerialGC 的串行收集器。
串行收集器使用单个线程来执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。
我对此进行了一些测试,
public class Example {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
Map<Integer, Object> map = new HashMap<>();
for (int count = 0; count < 60000; count++) {
map.put(count, new Object());
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
使用 SerialGC:
-Xms5m -Xmx5m -XX:+UseSerialGC -XX:+PrintGC
结果大约是 50 毫秒。
使用 ParallelGC:
-Xms5m -Xmx5m -XX:+UseParallelGC -XX:+PrintGC
结果大约是 6000 毫秒。
我知道在 ParallelGC 中线程之间的通信可能需要一些时间,在这种情况下,SerialGC 比 ParallelGC 快得多还有其他原因吗?
【问题讨论】:
标签: java garbage-collection jvm