8140255: Move the management of G1YoungRemSetSamplingThread from G1ConcurrentRefine
authortschatzl
Mon, 06 Nov 2017 14:25:18 +0100
changeset 47790 4925ee84b4ac
parent 47789 a77a7d3bc4f6
child 47791 71c9ee6b7cb3
8140255: Move the management of G1YoungRemSetSamplingThread from G1ConcurrentRefine Reviewed-by: sjohanss, sangheki
src/hotspot/share/gc/g1/g1CollectedHeap.cpp
src/hotspot/share/gc/g1/g1CollectedHeap.hpp
src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
src/hotspot/share/gc/g1/g1ConcurrentRefine.hpp
src/hotspot/share/gc/g1/g1RemSetSummary.cpp
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp	Mon Nov 06 14:24:31 2017 +0100
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp	Mon Nov 06 14:25:18 2017 +0100
@@ -54,6 +54,7 @@
 #include "gc/g1/g1SerialFullCollector.hpp"
 #include "gc/g1/g1StringDedup.hpp"
 #include "gc/g1/g1YCTypes.hpp"
+#include "gc/g1/g1YoungRemSetSamplingThread.hpp"
 #include "gc/g1/heapRegion.inline.hpp"
 #include "gc/g1/heapRegionRemSet.hpp"
 #include "gc/g1/heapRegionSet.inline.hpp"
@@ -1541,6 +1542,7 @@
 
 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* collector_policy) :
   CollectedHeap(),
+  _young_gen_sampling_thread(NULL),
   _collector_policy(collector_policy),
   _gc_timer_stw(new (ResourceObj::C_HEAP, mtGC) STWGCTimer()),
   _gc_tracer_stw(new (ResourceObj::C_HEAP, mtGC) G1NewTracer()),
@@ -1637,6 +1639,15 @@
   return ecode;
 }
 
+jint G1CollectedHeap::initialize_young_gen_sampling_thread() {
+  _young_gen_sampling_thread = new G1YoungRemSetSamplingThread();
+  if (_young_gen_sampling_thread->osthread() == NULL) {
+    vm_shutdown_during_initialization("Could not create G1YoungRemSetSamplingThread");
+    return JNI_ENOMEM;
+  }
+  return JNI_OK;
+}
+
 jint G1CollectedHeap::initialize() {
   CollectedHeap::pre_initialize();
   os::enable_vtime();
@@ -1789,6 +1800,11 @@
     return ecode;
   }
 
+  ecode = initialize_young_gen_sampling_thread();
+  if (ecode != JNI_OK) {
+    return ecode;
+  }
+
   JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
                                                 DirtyCardQ_FL_lock,
                                                 (int)concurrent_refine()->yellow_zone(),
@@ -1837,6 +1853,7 @@
   // do not continue to execute and access resources (e.g. logging)
   // that are destroyed during shutdown.
   _cr->stop();
+  _young_gen_sampling_thread->stop();
   _cmThread->stop();
   if (G1StringDedup::is_enabled()) {
     G1StringDedup::stop();
@@ -2436,7 +2453,8 @@
   _cmThread->print_on(st);
   st->cr();
   _cm->print_worker_threads_on(st);
-  _cr->print_worker_threads_on(st); // also prints the sample thread
+  _cr->print_threads_on(st);
+  _young_gen_sampling_thread->print_on(st);
   if (G1StringDedup::is_enabled()) {
     G1StringDedup::print_worker_threads_on(st);
   }
@@ -2446,7 +2464,8 @@
   workers()->threads_do(tc);
   tc->do_thread(_cmThread);
   _cm->threads_do(tc);
-  _cr->threads_do(tc); // also iterates over the sample thread
+  _cr->threads_do(tc);
+  tc->do_thread(_young_gen_sampling_thread);
   if (G1StringDedup::is_enabled()) {
     G1StringDedup::threads_do(tc);
   }
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp	Mon Nov 06 14:24:31 2017 +0100
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp	Mon Nov 06 14:25:18 2017 +0100
@@ -73,6 +73,7 @@
 class G1Policy;
 class G1HotCardCache;
 class G1RemSet;
+class G1YoungRemSetSamplingThread;
 class HeapRegionRemSetIterator;
 class G1ConcurrentMark;
 class ConcurrentMarkThread;
@@ -142,6 +143,8 @@
   friend class G1CheckCSetFastTableClosure;
 
 private:
+  G1YoungRemSetSamplingThread* _young_gen_sampling_thread;
+
   WorkGang* _workers;
   G1CollectorPolicy* _collector_policy;
 
@@ -553,6 +556,8 @@
   // during GC into global variables.
   void merge_per_thread_state_info(G1ParScanThreadStateSet* per_thread_states);
 public:
+  G1YoungRemSetSamplingThread* sampling_thread() const { return _young_gen_sampling_thread; }
+
   WorkGang* workers() const { return _workers; }
 
   G1Allocator* allocator() {
@@ -959,6 +964,7 @@
 
 private:
   jint initialize_concurrent_refinement();
+  jint initialize_young_gen_sampling_thread();
 public:
   // Initialize the G1CollectedHeap to have the initial and
   // maximum sizes and remembered and barrier sets
--- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp	Mon Nov 06 14:24:31 2017 +0100
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp	Mon Nov 06 14:25:18 2017 +0100
@@ -25,7 +25,6 @@
 #include "precompiled.hpp"
 #include "gc/g1/g1ConcurrentRefine.hpp"
 #include "gc/g1/g1ConcurrentRefineThread.hpp"
-#include "gc/g1/g1YoungRemSetSamplingThread.hpp"
 #include "logging/log.hpp"
 #include "runtime/java.hpp"
 #include "runtime/thread.hpp"
@@ -117,7 +116,6 @@
                                        size_t red_zone,
                                        size_t min_yellow_zone_size) :
   _threads(NULL),
-  _sample_thread(NULL),
   _n_worker_threads(thread_num()),
   _green_zone(green_zone),
   _yellow_zone(yellow_zone),
@@ -224,13 +222,6 @@
     next = t;
   }
 
-  cr->_sample_thread = new G1YoungRemSetSamplingThread();
-  if (cr->_sample_thread->osthread() == NULL) {
-    *ecode = JNI_ENOMEM;
-    vm_shutdown_during_initialization("Could not create G1YoungRemSetSamplingThread");
-    return NULL;
-  }
-
   *ecode = JNI_OK;
   return cr;
 }
@@ -239,7 +230,6 @@
   for (uint i = 0; i < _n_worker_threads; i++) {
     _threads[i]->stop();
   }
-  _sample_thread->stop();
 }
 
 void G1ConcurrentRefine::update_thread_thresholds() {
@@ -255,16 +245,9 @@
     delete _threads[i];
   }
   FREE_C_HEAP_ARRAY(G1ConcurrentRefineThread*, _threads);
-
-  delete _sample_thread;
 }
 
 void G1ConcurrentRefine::threads_do(ThreadClosure *tc) {
-  worker_threads_do(tc);
-  tc->do_thread(_sample_thread);
-}
-
-void G1ConcurrentRefine::worker_threads_do(ThreadClosure * tc) {
   for (uint i = 0; i < _n_worker_threads; i++) {
     tc->do_thread(_threads[i]);
   }
@@ -274,13 +257,11 @@
   return G1ConcRefinementThreads;
 }
 
-void G1ConcurrentRefine::print_worker_threads_on(outputStream* st) const {
+void G1ConcurrentRefine::print_threads_on(outputStream* st) const {
   for (uint i = 0; i < _n_worker_threads; ++i) {
     _threads[i]->print_on(st);
     st->cr();
   }
-  _sample_thread->print_on(st);
-  st->cr();
 }
 
 static size_t calc_new_green_zone(size_t green,
--- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.hpp	Mon Nov 06 14:24:31 2017 +0100
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.hpp	Mon Nov 06 14:25:18 2017 +0100
@@ -31,13 +31,10 @@
 // Forward decl
 class CardTableEntryClosure;
 class G1ConcurrentRefineThread;
-class G1YoungRemSetSamplingThread;
 class outputStream;
 class ThreadClosure;
 
 class G1ConcurrentRefine : public CHeapObj<mtGC> {
-  G1YoungRemSetSamplingThread* _sample_thread;
-
   G1ConcurrentRefineThread** _threads;
   uint _n_worker_threads;
  /*
@@ -86,18 +83,12 @@
 
   void adjust(double update_rs_time, size_t update_rs_processed_buffers, double goal_ms);
 
-  // Iterate over all concurrent refinement threads
+  // Iterate over all concurrent refinement threads applying the given closure.
   void threads_do(ThreadClosure *tc);
 
-  // Iterate over all worker refinement threads
-  void worker_threads_do(ThreadClosure * tc);
-
-  // The RS sampling thread has nothing to do with refinement, but is here for now.
-  G1YoungRemSetSamplingThread * sampling_thread() const { return _sample_thread; }
-
   static uint thread_num();
 
-  void print_worker_threads_on(outputStream* st) const;
+  void print_threads_on(outputStream* st) const;
 
   size_t green_zone() const      { return _green_zone;  }
   size_t yellow_zone() const     { return _yellow_zone; }
--- a/src/hotspot/share/gc/g1/g1RemSetSummary.cpp	Mon Nov 06 14:24:31 2017 +0100
+++ b/src/hotspot/share/gc/g1/g1RemSetSummary.cpp	Mon Nov 06 14:25:18 2017 +0100
@@ -59,12 +59,13 @@
 
   _num_coarsenings = HeapRegionRemSet::n_coarsenings();
 
-  G1ConcurrentRefine * cr = G1CollectedHeap::heap()->concurrent_refine();
+  G1CollectedHeap* g1h = G1CollectedHeap::heap();
+  G1ConcurrentRefine* cg1r = g1h->concurrent_refine();
   if (_rs_threads_vtimes != NULL) {
     GetRSThreadVTimeClosure p(this);
-    cr->worker_threads_do(&p);
+    cg1r->threads_do(&p);
   }
-  set_sampling_thread_vtime(cr->sampling_thread()->vtime_accum());
+  set_sampling_thread_vtime(g1h->sampling_thread()->vtime_accum());
 }
 
 void G1RemSetSummary::set_rs_thread_vtime(uint thread, double value) {