当我搜索我在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]
答案 0 :(得分:8)
JVM中有2个收藏家:年轻的太空收藏家和旧的太空收藏家。 HotSpot JVM正在实现一堆算法,但只有某些收集器组合是可行的。
PSYoungGen
是一个“并行清除”年轻空间GC算法,但它与旧空间(Tenured
)的默认串行算法不兼容。 PSOldGen
是序列旧空间算法,专门用于处理并行清除年轻空间算法 - PSYoungGen
。
您也可以为旧空间启用并行算法(-XX:+UseParallelOldGC
),在这种情况下,您会看到PSYoungGen
,ParOldGen
对算法正在运行。
您还可以启用另一个并行的年轻空间算法-XX:+UseParNewGC
,它将与默认的串行旧空间算法Tenured
串联。
我已经失去了你吗? :)
您可以在我的blog中阅读有关在HotSpot JVM中实现的算法的更多信息。
答案 1 :(得分:2)
在某种程度上,您是正确的,除非它实际上取决于您配置JVM命令行选项的方式。年轻的GC是Parallel Scavenge和多线程。
有趣的是,如果您使用-XX:+UseParallelGC
启动它,那么您将获得一个串行(单线程)Old Gen GC。如果您使用-XX:+UseParallelOldGC
,那么您将获得一个多线程,并行的年轻GC和多线程,并行旧版GC。
来源:Java Performance,第7章,垃圾收集器部分。
令人惊讶,不是吗。这里也有很多修修补补的空间! Java Performance书非常值得一读!