# HG changeset patch # User jmasa # Date 1429122636 25200 # Wed Apr 15 11:30:36 2015 -0700 # Node ID cc8f7aca0b175e8fb3865a37c41116c843dab140 # Parent 9498f65dc429279c30be4d199076a1041ce429bc 7012980: PSOldGen is increased if there is no space in Metaspace Reviewed-by: * * * imported patch is_system_gc 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 (!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; 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 && - (!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; 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 @@ -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; 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 (!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() + 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 ((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, 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 @@ -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); };