changeset 56448:f81dbe27a7b1

8227225: ParallelGC: add subspace transitions for young gen for gc+heap=info log lines Reviewed-by: tschatzl, kbarrett
author tonyp
date Tue, 06 Aug 2019 15:03:48 -0400
parents 5cc8f9225a6d
children bf8e76d86d05
files src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp src/hotspot/share/gc/parallel/psMarkSweep.cpp src/hotspot/share/gc/parallel/psOldGen.cpp src/hotspot/share/gc/parallel/psOldGen.hpp src/hotspot/share/gc/parallel/psParallelCompact.cpp src/hotspot/share/gc/parallel/psParallelCompact.hpp src/hotspot/share/gc/parallel/psScavenge.cpp src/hotspot/share/gc/parallel/psYoungGen.cpp src/hotspot/share/gc/parallel/psYoungGen.hpp src/hotspot/share/gc/shared/preGCValues.hpp
diffstat 11 files changed, 133 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp	Tue Aug 06 15:03:48 2019 -0400
@@ -616,6 +616,55 @@
       UseParallelOldGC ? PSParallelCompact::accumulated_time()->seconds() : PSMarkSweepProxy::accumulated_time()->seconds());
 }
 
+PreGenGCValues ParallelScavengeHeap::get_pre_gc_values() const {
+  const PSYoungGen* const young = young_gen();
+  const MutableSpace* const eden = young->eden_space();
+  const MutableSpace* const from = young->from_space();
+  const MutableSpace* const to = young->to_space();
+  const PSOldGen* const old = old_gen();
+
+  return PreGenGCValues(young->used_in_bytes(),
+                        young->capacity_in_bytes(),
+                        eden->used_in_bytes(),
+                        eden->capacity_in_bytes(),
+                        from->used_in_bytes(),
+                        from->capacity_in_bytes(),
+                        old->used_in_bytes(),
+                        old->capacity_in_bytes());
+}
+
+void ParallelScavengeHeap::print_heap_change(const PreGenGCValues& pre_gc_values) const {
+  const PSYoungGen* const young = young_gen();
+  const MutableSpace* const eden = young->eden_space();
+  const MutableSpace* const from = young->from_space();
+  const PSOldGen* const old = old_gen();
+
+  log_info(gc, heap)(HEAP_CHANGE_FORMAT" "
+                     HEAP_CHANGE_FORMAT" "
+                     HEAP_CHANGE_FORMAT,
+                     HEAP_CHANGE_FORMAT_ARGS(young->name(),
+                                             pre_gc_values.young_gen_used(),
+                                             pre_gc_values.young_gen_capacity(),
+                                             young->used_in_bytes(),
+                                             young->capacity_in_bytes()),
+                     HEAP_CHANGE_FORMAT_ARGS("Eden",
+                                             pre_gc_values.eden_used(),
+                                             pre_gc_values.eden_capacity(),
+                                             eden->used_in_bytes(),
+                                             eden->capacity_in_bytes()),
+                     HEAP_CHANGE_FORMAT_ARGS("From",
+                                             pre_gc_values.from_used(),
+                                             pre_gc_values.from_capacity(),
+                                             from->used_in_bytes(),
+                                             from->capacity_in_bytes()));
+  log_info(gc, heap)(HEAP_CHANGE_FORMAT,
+                     HEAP_CHANGE_FORMAT_ARGS(old->name(),
+                                             pre_gc_values.old_gen_used(),
+                                             pre_gc_values.old_gen_capacity(),
+                                             old->used_in_bytes(),
+                                             old->capacity_in_bytes()));
+  MetaspaceUtils::print_metaspace_change(pre_gc_values.metaspace_sizes());
+}
 
 void ParallelScavengeHeap::verify(VerifyOption option /* ignored */) {
   // Why do we need the total_collections()-filter below?
--- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp	Tue Aug 06 15:03:48 2019 -0400
@@ -33,12 +33,12 @@
 #include "gc/shared/collectedHeap.hpp"
 #include "gc/shared/gcPolicyCounters.hpp"
 #include "gc/shared/gcWhen.hpp"
+#include "gc/shared/preGCValues.hpp"
 #include "gc/shared/referenceProcessor.hpp"
 #include "gc/shared/softRefPolicy.hpp"
 #include "gc/shared/strongRootsScope.hpp"
 #include "logging/log.hpp"
 #include "memory/metaspace.hpp"
-#include "memory/metaspace/metaspaceSizesSnapshot.hpp"
 #include "utilities/growableArray.hpp"
 #include "utilities/ostream.hpp"
 
@@ -224,6 +224,9 @@
   virtual void gc_threads_do(ThreadClosure* tc) const;
   virtual void print_tracing_info() const;
 
+  PreGenGCValues get_pre_gc_values() const;
+  void print_heap_change(const PreGenGCValues& pre_gc_values) const;
+
   void verify(VerifyOption option /* ignored */);
 
   // Resize the young generation.  The reserved space for the
@@ -251,27 +254,6 @@
   GCMemoryManager* young_gc_manager() const { return _young_manager; }
 };
 
-// Simple class for storing info about the heap at the start of GC, to be used
-// after GC for comparison/printing.
-class PreGCValues {
-public:
-  PreGCValues(ParallelScavengeHeap* heap) :
-      _heap_used(heap->used()),
-      _young_gen_used(heap->young_gen()->used_in_bytes()),
-      _old_gen_used(heap->old_gen()->used_in_bytes()) { }
-
-  size_t heap_used() const      { return _heap_used; }
-  size_t young_gen_used() const { return _young_gen_used; }
-  size_t old_gen_used() const   { return _old_gen_used; }
-  const metaspace::MetaspaceSizesSnapshot& metaspace_sizes() const { return _meta_sizes; }
-
-private:
-  size_t _heap_used;
-  size_t _young_gen_used;
-  size_t _old_gen_used;
-  const metaspace::MetaspaceSizesSnapshot _meta_sizes;
-};
-
 // Class that can be used to print information about the
 // adaptive size policy at intervals specified by
 // AdaptiveSizePolicyOutputInterval.  Only print information
--- a/src/hotspot/share/gc/parallel/psMarkSweep.cpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psMarkSweep.cpp	Tue Aug 06 15:03:48 2019 -0400
@@ -193,7 +193,7 @@
 
     BiasedLocking::preserve_marks();
 
-    const PreGCValues pre_gc_values(heap);
+    const PreGenGCValues pre_gc_values = heap->get_pre_gc_values();
 
     allocate_stacks();
 
@@ -348,9 +348,7 @@
       accumulated_time()->stop();
     }
 
-    young_gen->print_used_change(pre_gc_values.young_gen_used());
-    old_gen->print_used_change(pre_gc_values.old_gen_used());
-    MetaspaceUtils::print_metaspace_change(pre_gc_values.metaspace_sizes());
+    heap->print_heap_change(pre_gc_values);
 
     // Track memory usage and detect low memory
     MemoryService::track_memory_usage();
--- a/src/hotspot/share/gc/parallel/psOldGen.cpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psOldGen.cpp	Tue Aug 06 15:03:48 2019 -0400
@@ -443,11 +443,6 @@
   st->print("  object"); object_space()->print_on(st);
 }
 
-void PSOldGen::print_used_change(size_t prev_used) const {
-  log_info(gc, heap)("%s: "  SIZE_FORMAT "K->" SIZE_FORMAT "K("  SIZE_FORMAT "K)",
-      name(), prev_used / K, used_in_bytes() / K, capacity_in_bytes() / K);
-}
-
 void PSOldGen::update_counters() {
   if (UsePerfData) {
     _space_counters->update_all();
--- a/src/hotspot/share/gc/parallel/psOldGen.hpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psOldGen.hpp	Tue Aug 06 15:03:48 2019 -0400
@@ -198,7 +198,6 @@
   // Debugging - do not use for time critical operations
   virtual void print() const;
   virtual void print_on(outputStream* st) const;
-  void print_used_change(size_t prev_used) const;
 
   void verify();
   void verify_object_start_array();
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp	Tue Aug 06 15:03:48 2019 -0400
@@ -1779,7 +1779,7 @@
   // miscellaneous bookkeeping.
   pre_compact();
 
-  const PreGCValues pre_gc_values(heap);
+  const PreGenGCValues pre_gc_values = heap->get_pre_gc_values();
 
   // Get the compaction manager reserved for the VM thread.
   ParCompactionManager* const vmthread_cm =
@@ -1923,9 +1923,7 @@
       accumulated_time()->stop();
     }
 
-    young_gen->print_used_change(pre_gc_values.young_gen_used());
-    old_gen->print_used_change(pre_gc_values.old_gen_used());
-    MetaspaceUtils::print_metaspace_change(pre_gc_values.metaspace_sizes());
+    heap->print_heap_change(pre_gc_values);
 
     // Track memory usage and detect low memory
     MemoryService::track_memory_usage();
--- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp	Tue Aug 06 15:03:48 2019 -0400
@@ -42,7 +42,6 @@
 class PSParallelCompact;
 class GCTaskManager;
 class GCTaskQueue;
-class PreGCValues;
 class MoveAndUpdateClosure;
 class RefProcTaskExecutor;
 class ParallelOldTracer;
--- a/src/hotspot/share/gc/parallel/psScavenge.cpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psScavenge.cpp	Tue Aug 06 15:03:48 2019 -0400
@@ -328,7 +328,7 @@
     reference_processor()->enable_discovery();
     reference_processor()->setup_policy(false);
 
-    const PreGCValues pre_gc_values(heap);
+    const PreGenGCValues pre_gc_values = heap->get_pre_gc_values();
 
     // Reset our survivor overflow.
     set_survivor_overflow(false);
@@ -598,9 +598,7 @@
       accumulated_time()->stop();
     }
 
-    young_gen->print_used_change(pre_gc_values.young_gen_used());
-    old_gen->print_used_change(pre_gc_values.old_gen_used());
-    MetaspaceUtils::print_metaspace_change(pre_gc_values.metaspace_sizes());
+    heap->print_heap_change(pre_gc_values);
 
     // Track memory usage and detect low memory
     MemoryService::track_memory_usage();
--- a/src/hotspot/share/gc/parallel/psYoungGen.cpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psYoungGen.cpp	Tue Aug 06 15:03:48 2019 -0400
@@ -766,12 +766,6 @@
   st->print("  to  "); to_space()->print_on(st);
 }
 
-// Note that a space is not printed before the [NAME:
-void PSYoungGen::print_used_change(size_t prev_used) const {
-  log_info(gc, heap)("%s: "  SIZE_FORMAT "K->" SIZE_FORMAT "K("  SIZE_FORMAT "K)",
-      name(), prev_used / K, used_in_bytes() / K, capacity_in_bytes() / K);
-}
-
 size_t PSYoungGen::available_for_expansion() {
   ShouldNotReachHere();
   return 0;
--- a/src/hotspot/share/gc/parallel/psYoungGen.hpp	Tue Aug 06 11:40:23 2019 -0400
+++ b/src/hotspot/share/gc/parallel/psYoungGen.hpp	Tue Aug 06 15:03:48 2019 -0400
@@ -180,7 +180,6 @@
   // Debugging - do not use for time critical operations
   void print() const;
   void print_on(outputStream* st) const;
-  void print_used_change(size_t prev_used) const;
   virtual const char* name() const { return "PSYoungGen"; }
 
   void verify();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hotspot/share/gc/shared/preGCValues.hpp	Tue Aug 06 15:03:48 2019 -0400
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, Twitter, Inc.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_GC_SHARED_PREGCVALUES_HPP
+#define SHARE_GC_SHARED_PREGCVALUES_HPP
+
+#include "memory/metaspace/metaspaceSizesSnapshot.hpp"
+
+// Simple class for storing info about the heap at the start of GC, to be used
+// after GC for comparison/printing.
+class PreGenGCValues {
+public:
+  PreGenGCValues(size_t young_gen_used,
+                 size_t young_gen_capacity,
+                 size_t eden_used,
+                 size_t eden_capacity,
+                 size_t from_used,
+                 size_t from_capacity,
+                 size_t old_gen_used,
+                 size_t old_gen_capacity)
+      : _young_gen_used(young_gen_used),
+        _young_gen_capacity(young_gen_capacity),
+        _eden_used(eden_used),
+        _eden_capacity(eden_capacity),
+        _from_used(from_used),
+        _from_capacity(from_capacity),
+        _old_gen_used(old_gen_used),
+        _old_gen_capacity(old_gen_capacity) { }
+
+  size_t young_gen_used()     const { return _young_gen_used;     }
+  size_t young_gen_capacity() const { return _young_gen_capacity; }
+  size_t eden_used()          const { return _eden_used;          }
+  size_t eden_capacity()      const { return _eden_capacity;      }
+  size_t from_used()          const { return _from_used;          }
+  size_t from_capacity()      const { return _from_capacity;      }
+  size_t old_gen_used()       const { return _old_gen_used;       }
+  size_t old_gen_capacity()   const { return _old_gen_capacity;   }
+  const metaspace::MetaspaceSizesSnapshot& metaspace_sizes() const { return _meta_sizes; }
+
+private:
+  const size_t _young_gen_used;
+  const size_t _young_gen_capacity;
+  const size_t _eden_used;
+  const size_t _eden_capacity;
+  const size_t _from_used;
+  const size_t _from_capacity;
+  const size_t _old_gen_used;
+  const size_t _old_gen_capacity;
+  const metaspace::MetaspaceSizesSnapshot _meta_sizes;
+};
+
+#endif // SHARE_GC_SHARED_PREGCVALUES_HPP