2

当我搜索在 gc 日志中看到的 PSOldGen 垃圾收集器时,我发现它是 Serial Mark-Sweep-Compact。如果这个 gc 是串行的,那么 PSOldGen 中的 PS 代表什么?AFAIK 它是并行清除。但这让我很困惑。

[Full GC [PSYoungGen: 647K->0K(60352K)] [PSOldGen: 45361K->45875K(54528K)] 46008K->45875K(114880K) [PSPermGen: 10201K->10201K(21248K)], 0.0359430 secs]
4

2 回答 2

8

JVM中有2个收集器:年轻空间收集器和老空间收集器。HotSpot JVM 正在实现一堆算法,但只有某些收集器组合是可行的。

PSYoungGen是一种“并行清除”年轻空间 GC 算法,但它与旧空间的默认串行算法不兼容(Tenured)。PSOldGen是一种串行旧空间算法,专门添加用于并行清除年轻空间算法 - PSYoungGen.

您也可以为旧空间启用并行算法( ),在这种情况下,-XX:+UseParallelOldGC您将看到一对算法在工作。PSYoungGenParOldGen

您还可以启用另一个并行年轻空间算法-XX:+UseParNewGC,它将与默认的串行旧空间算法串联Tenured

我已经失去你了吗?:)

您可以在我的博客中阅读有关 HotSpot JVM 中实现的算法的更多信息。

于 2013-05-08T16:25:15.600 回答
2

在某种程度上,您是正确的,但它实际上取决于您如何配置 JVM 命令行选项。新生代 GC 是 Parallel Scavenge 和多线程的。

有趣的是,如果您使用-XX:+UseParallelGCthen 启动它,您将获得一个串行(单线程)旧代 GC。如果您使用-XX:+UseParallelOldGC,那么您将获得一个多线程、并行的年轻一代 GC 和一个多线程、并行的老一代 GC。

资料来源:Java 性能,第 7 章,垃圾收集器部分。

令人惊讶,不是吗。这里也有很大的修补空间!Java Performance 这本书非常值得一读!

于 2013-05-08T16:13:45.513 回答