Mercurial > hg > jdk9-shenandoah > hotspot
changeset 9424:1756c98d5437
7012980: PSOldGen is increased if there is no space in Metaspace
Reviewed-by: tschatzl, tbenson
author | jmasa |
---|---|
date | Wed, 15 Apr 2015 11:30:36 -0700 |
parents | 897cbd5207a6 |
children | ee53b343d8d7 2963c44aa1f5 |
files | src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp src/share/vm/gc/parallel/psMarkSweep.cpp src/share/vm/gc/parallel/psParallelCompact.cpp src/share/vm/gc/parallel/psScavenge.cpp src/share/vm/gc/shared/adaptiveSizePolicy.hpp src/share/vm/gc/shared/gcCause.hpp |
diffstat | 6 files changed, 46 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp Tue Jul 07 18:16:06 2015 +0000 +++ b/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/src/share/vm/gc/parallel/psMarkSweep.cpp Tue Jul 07 18:16:06 2015 +0000 +++ b/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/src/share/vm/gc/parallel/psParallelCompact.cpp Tue Jul 07 18:16:06 2015 +0000 +++ b/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/src/share/vm/gc/parallel/psScavenge.cpp Tue Jul 07 18:16:06 2015 +0000 +++ b/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/src/share/vm/gc/shared/adaptiveSizePolicy.hpp Tue Jul 07 18:16:06 2015 +0000 +++ b/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/src/share/vm/gc/shared/gcCause.hpp Tue Jul 07 18:16:06 2015 +0000 +++ b/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); };