8188919: Generalize GC thread suspend/resume at safepoints
Reviewed-by: pliden, rkennke
--- a/src/hotspot/share/gc/cms/cmsHeap.cpp Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/cms/cmsHeap.cpp Tue Oct 17 08:51:55 2017 +0200
@@ -134,6 +134,14 @@
ConcurrentMarkSweepThread::cmst()->stop();
}
+void CMSHeap::safepoint_synchronize_begin() {
+ ConcurrentMarkSweepThread::synchronize(false);
+}
+
+void CMSHeap::safepoint_synchronize_end() {
+ ConcurrentMarkSweepThread::desynchronize(false);
+}
+
void CMSHeap::cms_process_roots(StrongRootsScope* scope,
bool young_gen_as_roots,
ScanningOption so,
--- a/src/hotspot/share/gc/cms/cmsHeap.hpp Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/cms/cmsHeap.hpp Tue Oct 17 08:51:55 2017 +0200
@@ -79,6 +79,8 @@
}
void stop();
+ void safepoint_synchronize_begin();
+ void safepoint_synchronize_end();
// If "young_gen_as_roots" is false, younger generations are
// not scanned as roots; in this case, the caller must be arranging to
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Tue Oct 17 08:51:55 2017 +0200
@@ -1842,6 +1842,14 @@
}
}
+void G1CollectedHeap::safepoint_synchronize_begin() {
+ SuspendibleThreadSet::synchronize();
+}
+
+void G1CollectedHeap::safepoint_synchronize_end() {
+ SuspendibleThreadSet::desynchronize();
+}
+
size_t G1CollectedHeap::conservative_max_heap_alignment() {
return HeapRegion::max_region_size();
}
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Tue Oct 17 08:51:55 2017 +0200
@@ -968,6 +968,8 @@
jint initialize();
virtual void stop();
+ virtual void safepoint_synchronize_begin();
+ virtual void safepoint_synchronize_end();
// Return the (conservative) maximum heap alignment for any G1 heap
static size_t conservative_max_heap_alignment();
--- a/src/hotspot/share/gc/shared/collectedHeap.hpp Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/gc/shared/collectedHeap.hpp Tue Oct 17 08:51:55 2017 +0200
@@ -221,6 +221,10 @@
// Stop any onging concurrent work and prepare for exit.
virtual void stop() {}
+ // Stop and resume concurrent GC threads interfering with safepoint operations
+ virtual void safepoint_synchronize_begin() {}
+ virtual void safepoint_synchronize_end() {}
+
void initialize_reserved_region(HeapWord *start, HeapWord *end);
MemRegion reserved_region() const { return _reserved; }
address base() const { return (address)reserved_region().start(); }
--- a/src/hotspot/share/runtime/safepoint.cpp Mon Oct 16 23:23:27 2017 -0700
+++ b/src/hotspot/share/runtime/safepoint.cpp Tue Oct 17 08:51:55 2017 +0200
@@ -63,10 +63,6 @@
#include "trace/traceMacros.hpp"
#include "utilities/events.hpp"
#include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
-#include "gc/cms/concurrentMarkSweepThread.hpp"
-#include "gc/g1/suspendibleThreadSet.hpp"
-#endif // INCLUDE_ALL_GCS
#ifdef COMPILER1
#include "c1/c1_globals.hpp"
#endif
@@ -94,15 +90,7 @@
_ts_of_current_safepoint = tty->time_stamp().seconds();
}
-#if INCLUDE_ALL_GCS
- if (UseConcMarkSweepGC) {
- // In the future we should investigate whether CMS can use the
- // more-general mechanism below. DLD (01/05).
- ConcurrentMarkSweepThread::synchronize(false);
- } else if (UseG1GC) {
- SuspendibleThreadSet::synchronize();
- }
-#endif // INCLUDE_ALL_GCS
+ Universe::heap()->safepoint_synchronize_begin();
// By getting the Threads_lock, we assure that no threads are about to start or
// exit. It is released again in SafepointSynchronize::end().
@@ -512,14 +500,7 @@
Threads_lock->unlock();
}
-#if INCLUDE_ALL_GCS
- // If there are any concurrent GC threads resume them.
- if (UseConcMarkSweepGC) {
- ConcurrentMarkSweepThread::desynchronize(false);
- } else if (UseG1GC) {
- SuspendibleThreadSet::desynchronize();
- }
-#endif // INCLUDE_ALL_GCS
+ Universe::heap()->safepoint_synchronize_end();
// record this time so VMThread can keep track how much time has elapsed
// since last safepoint.
_end_of_last_safepoint = os::javaTimeMillis();