8057818: collect allocation context statistics at gc pauses
Reviewed-by: mikael, jmasa
diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
index f22bc26..8ff2c87 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
@@ -3334,6 +3334,7 @@
} else {
g1_par_agg_task.work(0);
}
+ _g1h->allocation_context_stats().update_at_remark();
}
// Clear the per-worker arrays used to store the per-region counting data
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1AllocationContext.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1AllocationContext.hpp
index 788de8a..3f114cb 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1AllocationContext.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1AllocationContext.hpp
@@ -41,4 +41,11 @@
}
};
+class AllocationContextStats: public StackObj {
+public:
+ inline void clear() { }
+ inline void update(bool full_gc) { }
+ inline void update_at_remark() { }
+};
+
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1ALLOCATIONCONTEXT_HPP
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
index ab9d37f..6630e71 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
@@ -3596,7 +3596,7 @@
}
}
-void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
+void G1CollectedHeap::gc_epilogue(bool full) {
if (G1SummarizeRSetStats &&
(G1SummarizeRSetStatsPeriod > 0) &&
@@ -3613,6 +3613,7 @@
// always_do_update_barrier = true;
resize_all_tlabs();
+ allocation_context_stats().update(full);
// We have just completed a GC. Update the soft reference
// policy with the new heap occupancy
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp
index d1305da..3fc6b6c 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp
@@ -263,6 +263,9 @@
// Class that handles the different kinds of allocations.
G1Allocator* _allocator;
+ // Statistics for each allocation context
+ AllocationContextStats _allocation_context_stats;
+
// PLAB sizing policy for survivors.
PLABStats _survivor_plab_stats;
@@ -657,6 +660,8 @@
// Determines PLAB size for a particular allocation purpose.
size_t desired_plab_sz(GCAllocPurpose purpose);
+ inline AllocationContextStats& allocation_context_stats();
+
// Do anything common to GC's.
virtual void gc_prologue(bool full);
virtual void gc_epilogue(bool full);
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp
index 18298dd..f73b6d1 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp
@@ -37,6 +37,10 @@
// Inline functions for G1CollectedHeap
+inline AllocationContextStats& G1CollectedHeap::allocation_context_stats() {
+ return _allocation_context_stats;
+}
+
// Return the region with the given index. It assumes the index is valid.
inline HeapRegion* G1CollectedHeap::region_at(uint index) const { return _hrm.at(index); }