2013-05-08 79 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性能書很值得一讀!