--- old/src/hotspot/share/gc/g1/g1ConcurrentRefineThread.cpp 2017-11-20 12:10:01.711276330 +0100 +++ new/src/hotspot/share/gc/g1/g1ConcurrentRefineThread.cpp 2017-11-20 12:10:01.304263973 +0100 @@ -25,32 +25,20 @@ #include "precompiled.hpp" #include "gc/g1/g1ConcurrentRefine.hpp" #include "gc/g1/g1ConcurrentRefineThread.hpp" -#include "gc/g1/g1CollectedHeap.inline.hpp" -#include "gc/g1/g1RemSet.hpp" #include "gc/shared/suspendibleThreadSet.hpp" #include "logging/log.hpp" #include "memory/resourceArea.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutexLocker.hpp" -G1ConcurrentRefineThread::G1ConcurrentRefineThread(G1ConcurrentRefine* cr, - G1ConcurrentRefineThread *next, - uint worker_id_offset, - uint worker_id, - size_t activate, - size_t deactivate) : +G1ConcurrentRefineThread::G1ConcurrentRefineThread(G1ConcurrentRefine* cr, uint worker_id) : ConcurrentGCThread(), - _worker_id_offset(worker_id_offset), _worker_id(worker_id), _active(false), - _next(next), _monitor(NULL), _cr(cr), - _vtime_accum(0.0), - _activation_threshold(activate), - _deactivation_threshold(deactivate) + _vtime_accum(0.0) { - // Each thread has its own monitor. The i-th thread is responsible for signaling // to thread i+1 if the number of buffers in the queue exceeds a threshold for this // thread. Monitors are also used to wake up the threads during termination. @@ -67,13 +55,6 @@ create_and_start(); } -void G1ConcurrentRefineThread::update_thresholds(size_t activate, - size_t deactivate) { - assert(deactivate < activate, "precondition"); - _activation_threshold = activate; - _deactivation_threshold = deactivate; -} - void G1ConcurrentRefineThread::wait_for_completed_buffers() { MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag); while (!should_terminate() && !is_active()) { @@ -118,9 +99,9 @@ } size_t buffers_processed = 0; - DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); - log_debug(gc, refine)("Activated %d, on threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT, - _worker_id, _activation_threshold, dcqs.completed_buffers_num()); + log_debug(gc, refine)("Activated worker %d, on threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT, + _worker_id, _cr->activation_threshold(_worker_id), + JavaThread::dirty_card_queue_set().completed_buffers_num()); { SuspendibleThreadSetJoiner sts_join; @@ -131,33 +112,18 @@ continue; // Re-check for termination after yield delay. } - size_t curr_buffer_num = dcqs.completed_buffers_num(); - // If the number of the buffers falls down into the yellow zone, - // that means that the transition period after the evacuation pause has ended. - if (dcqs.completed_queue_padding() > 0 && curr_buffer_num <= cr()->yellow_zone()) { - dcqs.set_completed_queue_padding(0); - } - - // Check if we need to activate the next thread. - if ((_next != NULL) && - !_next->is_active() && - (curr_buffer_num > _next->_activation_threshold)) { - _next->activate(); - } - - // Process the next buffer, if there are enough left. - if (!dcqs.refine_completed_buffer_concurrently(_worker_id + _worker_id_offset, _deactivation_threshold)) { - break; // Deactivate, number of buffers fell below threshold. + if (!_cr->do_refinement_step(_worker_id)) { + break; } ++buffers_processed; } } deactivate(); - log_debug(gc, refine)("Deactivated %d, off threshold: " SIZE_FORMAT + log_debug(gc, refine)("Deactivated worker %d, off threshold: " SIZE_FORMAT ", current: " SIZE_FORMAT ", processed: " SIZE_FORMAT, - _worker_id, _deactivation_threshold, - dcqs.completed_buffers_num(), + _worker_id, _cr->deactivation_threshold(_worker_id), + JavaThread::dirty_card_queue_set().completed_buffers_num(), buffers_processed); if (os::supports_vtime()) {