7012980: PSOldGen is increased if there is no space in Metaspace
Reviewed-by: tschatzl, tbenson
--- 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);
};