7012980: PSOldGen is increased if there is no space in Metaspace
authorjmasa
Wed, 15 Apr 2015 11:30:36 -0700
changeset 31634 0aa645cd8cc3
parent 31633 14baf083f6ad
child 31635 6bf7a358ca17
child 31776 70dd826a47b5
7012980: PSOldGen is increased if there is no space in Metaspace Reviewed-by: tschatzl, tbenson
hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp
hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp
hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp
hotspot/src/share/vm/gc/parallel/psScavenge.cpp
hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.hpp
hotspot/src/share/vm/gc/shared/gcCause.hpp
--- a/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp	Tue Jul 07 18:16:06 2015 +0000
+++ b/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp	Wed Apr 15 11:30:36 2015 -0700
@@ -130,8 +130,7 @@
   // Update the pause time.
   _major_timer.stop();
 
-  if (!GCCause::is_user_requested_gc(gc_cause) ||
-      UseAdaptiveSizePolicyWithSystemGC) {
+  if (should_update_promo_stats(gc_cause)) {
     double major_pause_in_seconds = _major_timer.seconds();
     double major_pause_in_ms = major_pause_in_seconds * MILLIUNITS;
 
--- a/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp	Tue Jul 07 18:16:06 2015 +0000
+++ b/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp	Wed Apr 15 11:30:36 2015 -0700
@@ -272,8 +272,7 @@
       // Don't check if the size_policy is ready here.  Let
       // the size_policy check that internally.
       if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
-          (!GCCause::is_user_requested_gc(gc_cause) ||
-            UseAdaptiveSizePolicyWithSystemGC)) {
+          AdaptiveSizePolicy::should_update_promo_stats(gc_cause)) {
         // Swap the survivor spaces if from_space is empty. The
         // resize_young_gen() called below is normally used after
         // a successful young GC and swapping of survivor spaces;
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp	Tue Jul 07 18:16:06 2015 +0000
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp	Wed Apr 15 11:30:36 2015 -0700
@@ -2089,8 +2089,7 @@
       // Don't check if the size_policy is ready here.  Let
       // the size_policy check that internally.
       if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
-          (!GCCause::is_user_requested_gc(gc_cause) ||
-            UseAdaptiveSizePolicyWithSystemGC)) {
+          AdaptiveSizePolicy::should_update_promo_stats(gc_cause)) {
         // Swap the survivor spaces if from_space is empty. The
         // resize_young_gen() called below is normally used after
         // a successful young GC and swapping of survivor spaces;
--- a/hotspot/src/share/vm/gc/parallel/psScavenge.cpp	Tue Jul 07 18:16:06 2015 +0000
+++ b/hotspot/src/share/vm/gc/parallel/psScavenge.cpp	Wed Apr 15 11:30:36 2015 -0700
@@ -290,8 +290,7 @@
 
   AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
 
-  if (!GCCause::is_user_requested_gc(gc_cause) ||
-       UseAdaptiveSizePolicyWithSystemGC) {
+  if (AdaptiveSizePolicy::should_update_eden_stats(gc_cause)) {
     // Gather the feedback data for eden occupancy.
     young_gen->eden_space()->accumulate_statistics();
   }
@@ -559,9 +558,7 @@
         // Don't check if the size_policy is ready at this
         // level.  Let the size_policy check that internally.
         if (UseAdaptiveGenerationSizePolicyAtMinorCollection &&
-            ((gc_cause != GCCause::_java_lang_system_gc) ||
-              UseAdaptiveSizePolicyWithSystemGC)) {
-
+            (AdaptiveSizePolicy::should_update_eden_stats(gc_cause))) {
           // Calculate optimal free space amounts
           assert(young_gen->max_size() >
             young_gen->from_space()->capacity_in_bytes() +
--- a/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.hpp	Tue Jul 07 18:16:06 2015 +0000
+++ b/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.hpp	Wed Apr 15 11:30:36 2015 -0700
@@ -487,6 +487,18 @@
                                GCCause::Cause gc_cause,
                                CollectorPolicy* collector_policy);
 
+  static bool should_update_promo_stats(GCCause::Cause cause) {
+    return ((GCCause::is_user_requested_gc(cause)  &&
+               UseAdaptiveSizePolicyWithSystemGC) ||
+            GCCause::is_tenured_allocation_failure_gc(cause));
+  }
+
+  static bool should_update_eden_stats(GCCause::Cause cause) {
+    return ((GCCause::is_user_requested_gc(cause)  &&
+               UseAdaptiveSizePolicyWithSystemGC) ||
+            GCCause::is_allocation_failure_gc(cause));
+  }
+
   // Printing support
   virtual bool print_adaptive_size_policy_on(outputStream* st) const;
   bool print_adaptive_size_policy_on(outputStream* st,
--- a/hotspot/src/share/vm/gc/shared/gcCause.hpp	Tue Jul 07 18:16:06 2015 +0000
+++ b/hotspot/src/share/vm/gc/shared/gcCause.hpp	Wed Apr 15 11:30:36 2015 -0700
@@ -92,6 +92,35 @@
             cause == GCCause::_heap_dump);
   }
 
+  // Causes for collection of the tenured gernation
+  inline static bool is_tenured_allocation_failure_gc(GCCause::Cause cause) {
+    assert(cause != GCCause::_old_generation_too_full_to_scavenge &&
+      cause != GCCause::_old_generation_expanded_on_last_scavenge,
+      err_msg("This GCCause may be correct but is not expected yet: %s",
+      to_string(cause)));
+    // _tenured_generation_full or _cms_generation_full for full tenured generations
+    // _adaptive_size_policy for a full collection after a young GC
+    // _allocation_failure is the generic cause a collection which could result
+    // in the collection of the tenured generation if there is not enough space
+    // in the tenured generation to support a young GC.
+    // _last_ditch_collection is a collection done to include SoftReferences.
+    return (cause == GCCause::_tenured_generation_full ||
+            cause == GCCause::_cms_generation_full ||
+            cause == GCCause::_adaptive_size_policy ||
+            cause == GCCause::_allocation_failure ||
+            cause == GCCause::_last_ditch_collection);
+  }
+
+  // Causes for collection of the young generation
+  inline static bool is_allocation_failure_gc(GCCause::Cause cause) {
+    // _allocation_failure is the generic cause a collection for allocation failure
+    // _adaptive_size_policy is for a collecton done before a full GC
+    // _last_ditch_collection is a collection done to include SoftReferences.
+    return (cause == GCCause::_allocation_failure ||
+            cause == GCCause::_adaptive_size_policy ||
+            cause == GCCause::_last_ditch_collection);
+  }
+
   // Return a string describing the GCCause.
   static const char* to_string(GCCause::Cause cause);
 };