< prev index next >

src/hotspot/share/gc/g1/g1OldGenAllocationTracker.cpp

Print this page

        

@@ -22,21 +22,61 @@
  *
  */
 
 #include "precompiled.hpp"
 #include "gc/g1/g1OldGenAllocationTracker.hpp"
+#include "logging/log.hpp"
 
 G1OldGenAllocationTracker::G1OldGenAllocationTracker() :
   _last_cycle_old_bytes(0),
+  _last_cycle_humongous_bytes(0),
   _last_cycle_duration(0.0),
-  _allocated_bytes_since_last_gc(0) {
+  _humongous_bytes_after_last_gc(0),
+  _humongous_bytes_after_penultimate_gc(0),
+  _allocated_bytes_since_last_gc(0),
+  _allocated_humongous_bytes_since_last_gc(0) {
 }
 
-void G1OldGenAllocationTracker::reset_after_full_gc() {
+double G1OldGenAllocationTracker::adjusted_last_cycle_old_allocation_rate_ihop() const {
+  // The upper limit of the freed region count is the number of regions allocated
+  // since the last gc. When more humongous regions survived the current gc than
+  // survived the previous one, deduct the increment.
+  assert(_last_cycle_duration > 0, "This should not be called when the last GC is full");
+  size_t freed_humongous_bytes = _last_cycle_humongous_bytes;
+  if (freed_humongous_bytes > 0 && _humongous_bytes_after_penultimate_gc < _humongous_bytes_after_last_gc) {
+    freed_humongous_bytes -= _humongous_bytes_after_last_gc - _humongous_bytes_after_penultimate_gc;
+  }
+  assert(_last_cycle_old_bytes >= freed_humongous_bytes, "Allocation rate cannot be negative");
+  return (_last_cycle_old_bytes - freed_humongous_bytes) / _last_cycle_duration;
+ }
+ 
+void G1OldGenAllocationTracker::reset_cycle_after_gc(size_t humongous_bytes_after_gc) {
+  // Record last
+  _last_cycle_old_bytes = _allocated_bytes_since_last_gc;
+  _last_cycle_humongous_bytes = _allocated_humongous_bytes_since_last_gc;
+  _humongous_bytes_after_penultimate_gc = _humongous_bytes_after_last_gc;
+  _humongous_bytes_after_last_gc = humongous_bytes_after_gc;
+  // Reset
+  _allocated_bytes_since_last_gc = 0;
+  _allocated_humongous_bytes_since_last_gc = 0;
+}
+ 
+void G1OldGenAllocationTracker::reset_after_full_gc(size_t humongous_bytes_after_gc) {
   _last_cycle_duration = 0;
-  reset_cycle_after_gc();
+  reset_cycle_after_gc(humongous_bytes_after_gc);
+  log_debug(gc, stats)("Old generation allocation update (Full GC), "
+                       "old gen allocated: " SIZE_FORMAT "B, humongous allocated: " SIZE_FORMAT "B.",
+                       _last_cycle_old_bytes, _last_cycle_humongous_bytes);
 }
 
-void G1OldGenAllocationTracker::reset_after_young_gc(double allocation_duration_s) {
+void G1OldGenAllocationTracker::reset_after_young_gc(double allocation_duration_s,
+                                                     size_t humongous_bytes_after_gc) {
+  assert(allocation_duration_s > 0, "Allocation duration must be larger than zero but is  %.3f", allocation_duration_s);
   _last_cycle_duration = allocation_duration_s;
-  reset_cycle_after_gc();
+  reset_cycle_after_gc(humongous_bytes_after_gc);
+  log_debug(gc, stats)("Old generation allocation update, duration %1.3fs, "
+                       "old gen allocated: " SIZE_FORMAT "B, old gen allocation rate: %1.2fB/s, "
+                       "humongous allocated: " SIZE_FORMAT "B, humongous allocation rate: %1.2fB/s",
+                       _last_cycle_duration,
+                       _last_cycle_old_bytes, last_cycle_old_allocation_rate(),
+                       _last_cycle_humongous_bytes, (double)_last_cycle_humongous_bytes / _last_cycle_duration);
 }
\ No newline at end of file
< prev index next >