2013-05-08 83 views
2

当我搜索我在gc日志中看到的PSOldGen垃圾回收器时,发现它是Serial Mark-Sweep-Compact。如果这个gc是串行的,PSOldGen中的PS代表什么? AFAIK它是并行清除。但是这让我困惑。串行标记扫描紧凑型(PSOldGen)PS代表什么?

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

回答

7

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

PSYoungGen是“平行扫”青年空间GC算法,但其不与旧的空间(Tenured)默认的串行算法兼容。 PSOldGen是一个系列旧空间算法,这是专门添加与并行清除年轻的空间算法 - PSYoungGen

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

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

我已经失去了你吗? :)

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

+1

热点GC备忘单打印在我的桌子上。 – 2013-05-08 17:53:03

+1

您可以使用Serial Mark-Sweep-Compact(Tenured)更新第一个旧收集器的备忘单吗?并可能为ParNew + Tenured组合添加一个新行?问候。 – 2013-05-08 19:28:19

2

从某种意义上说,你是对的,除非它真的取决于你如何配置你的JVM命令行选项。年轻的GC是Parallel Scavenge和多线程的。有趣的是,如果你使用-XX:+UseParallelGC来启动它,那么你将得到一个串行(单线程)Old Gen GC。如果您使用-XX:+UseParallelOldGC,那么您将同时获得一个多线程,并行的年轻gen GC和一个多线程,并行的旧gen GC。

来源:Java Performance第7章垃圾收集器一节。

令人惊讶的是,不是吗。这里也有很多修补的地方! Java性能书很值得一读!