天天看點

JVM預設老年代回收是 PSMarkSweep(Serial-Old) 還是Parallel Old?

這個問題的答案取決于JDK版本,在2012年預設值改變過一次。

這個改進使得HotSpot VM在選擇使用ParallelGC(-XX:+UseParallelGC 或者是ergonomics自動選擇)的時候,會預設開啟 -XX:+UseParallelOldGC 。這個變更應該是在JDK7u4開始的JDK7u系列與JDK8系列開始生效。

對應的patch是:

--- a/src/share/vm/runtime/arguments.cpp  Mon Jan 30 15:21:57 2012 +0100
+++ b/src/share/vm/runtime/arguments.cpp  Thu Feb 02 16:05:17 2012 -0800
@@ -1400,10 +1400,11 @@
 
 void Arguments::set_parallel_gc_flags() {
   assert(UseParallelGC || UseParallelOldGC, "Error");
-  // If parallel old was requested, automatically enable parallel scavenge.
-  if (UseParallelOldGC && !UseParallelGC && FLAG_IS_DEFAULT(UseParallelGC)) {
-    FLAG_SET_DEFAULT(UseParallelGC, true);
+  // Enable ParallelOld unless it was explicitly disabled (cmd line or rc file).
+  if (FLAG_IS_DEFAULT(UseParallelOldGC)) {
+    FLAG_SET_DEFAULT(UseParallelOldGC, true);
   }
+  FLAG_SET_DEFAULT(UseParallelGC, true);
 
   // If no heap maximum was requested explicitly, use some reasonable fraction
   // of the physical memory, up to a maximum of 1GB.      

在這個改變之前,即便選擇了ParallelGC,預設情況下ParallelOldGC并不會随即開啟,而是要自己通過 -XX:+UseParallelOldGC 去標明。

在GC日志裡,如果看到Full GC裡有"ParOldGen"就是選擇了ParallelOldGC。

[Full GC [PSYoungGen: 480K->0K(3584K)] [ParOldGen: 4660K->4909K(12288K)] 5141K->4909K(15872K) [PSPermGen: 11202K->11198K(22528K)], 0.0515530 secs] [Times: user=0.08 sys=0.00, real=0.05 secs]