8188919: Generalize GC thread suspend/resume at safepoints

Reviewed-by: pliden, rkennke
This commit is contained in:
Erik Österlund 2017-10-17 08:51:55 +02:00
parent e8fe842a41
commit 9adfa12663
6 changed files with 26 additions and 21 deletions

@ -134,6 +134,14 @@ void CMSHeap::stop() {
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,

@ -79,6 +79,8 @@ public:
}
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

@ -1842,6 +1842,14 @@ void G1CollectedHeap::stop() {
}
}
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();
}

@ -968,6 +968,8 @@ public:
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();

@ -221,6 +221,10 @@ class CollectedHeap : public CHeapObj<mtInternal> {
// 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(); }

@ -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 @@ void SafepointSynchronize::begin() {
_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 @@ void SafepointSynchronize::end() {
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();