# HG changeset patch # User jmasa # Date 1429122636 25200 # Wed Apr 15 11:30:36 2015 -0700 # Node ID c5d900e892f2ca8b4aaf4142da06be987298840a # Parent 92457dfb91bd28dcd810b0811230f0750108511f 7012980: PSOldGen is increased if there is no space in Metaspace Reviewed-by: diff --git a/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp b/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp --- a/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp +++ b/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp @@ -130,8 +130,7 @@ // Update the pause time. _major_timer.stop(); - if (gc_cause != GCCause::_java_lang_system_gc || - 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; diff --git a/src/share/vm/gc/parallel/psMarkSweep.cpp b/src/share/vm/gc/parallel/psMarkSweep.cpp --- a/src/share/vm/gc/parallel/psMarkSweep.cpp +++ b/src/share/vm/gc/parallel/psMarkSweep.cpp @@ -272,8 +272,7 @@ // Don't check if the size_policy is ready here. Let // the size_policy check that internally. if (UseAdaptiveGenerationSizePolicyAtMajorCollection && - ((gc_cause != GCCause::_java_lang_system_gc) || - 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; diff --git a/src/share/vm/gc/parallel/psParallelCompact.cpp b/src/share/vm/gc/parallel/psParallelCompact.cpp --- a/src/share/vm/gc/parallel/psParallelCompact.cpp +++ b/src/share/vm/gc/parallel/psParallelCompact.cpp @@ -2090,8 +2090,7 @@ // Don't check if the size_policy is ready here. Let // the size_policy check that internally. if (UseAdaptiveGenerationSizePolicyAtMajorCollection && - ((gc_cause != GCCause::_java_lang_system_gc) || - 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; diff --git a/src/share/vm/gc/parallel/psScavenge.cpp b/src/share/vm/gc/parallel/psScavenge.cpp --- a/src/share/vm/gc/parallel/psScavenge.cpp +++ b/src/share/vm/gc/parallel/psScavenge.cpp @@ -290,8 +290,7 @@ AdaptiveSizePolicyOutput(size_policy, heap->total_collections()); - if ((gc_cause != GCCause::_java_lang_system_gc) || - UseAdaptiveSizePolicyWithSystemGC) { + if (AdaptiveSizePolicy::should_update_eden_stats(gc_cause)) { // Gather the feedback data for eden occupancy. young_gen->eden_space()->accumulate_statistics(); } @@ -560,9 +559,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() + diff --git a/src/share/vm/gc/shared/adaptiveSizePolicy.hpp b/src/share/vm/gc/shared/adaptiveSizePolicy.hpp --- a/src/share/vm/gc/shared/adaptiveSizePolicy.hpp +++ b/src/share/vm/gc/shared/adaptiveSizePolicy.hpp @@ -487,6 +487,18 @@ GCCause::Cause gc_cause, CollectorPolicy* collector_policy); + static bool should_update_promo_stats(GCCause::Cause cause) { + return ((cause == GCCause::_java_lang_system_gc && + UseAdaptiveSizePolicyWithSystemGC) || + GCCause::is_tenured_allocation_failure_gc(cause)); + } + + static bool should_update_eden_stats(GCCause::Cause cause) { + return ((cause == GCCause::_java_lang_system_gc && + 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, diff --git a/src/share/vm/gc/shared/gcCause.hpp b/src/share/vm/gc/shared/gcCause.hpp --- a/src/share/vm/gc/shared/gcCause.hpp +++ b/src/share/vm/gc/shared/gcCause.hpp @@ -89,6 +89,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); };