--- old/src/share/vm/gc/g1/concurrentG1RefineThread.cpp 2015-08-12 14:09:21.000000000 +0200 +++ new/src/share/vm/gc/g1/concurrentG1RefineThread.cpp 2015-08-12 14:09:20.000000000 +0200 @@ -34,10 +34,8 @@ ConcurrentG1RefineThread:: ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread *next, - CardTableEntryClosure* refine_closure, uint worker_id_offset, uint worker_id) : ConcurrentGCThread(), - _refine_closure(refine_closure), _worker_id_offset(worker_id_offset), _worker_id(worker_id), _active(false), @@ -190,6 +188,7 @@ { SuspendibleThreadSetJoiner sts_join; + BufferedRefineCardTableEntryClosure cl; do { int curr_buffer_num = (int)dcqs.completed_buffers_num(); @@ -203,6 +202,7 @@ // If the number of the buffer has fallen below our threshold // we should deactivate. The predecessor will reactivate this // thread should the number of the buffers cross the threshold again. + cl.flush_buffer(); deactivate(); break; } @@ -211,7 +211,9 @@ if (_next != NULL && !_next->is_active() && curr_buffer_num > _next->_threshold) { _next->activate(); } - } while (dcqs.apply_closure_to_completed_buffer(_refine_closure, _worker_id + _worker_id_offset, cg1r()->green_zone())); + } while (dcqs.apply_closure_to_completed_buffer(&cl, _worker_id + _worker_id_offset, cg1r()->green_zone())); + + cl.flush_buffer(); // We can exit the loop above while being active if there was a yield request. if (is_active()) { @@ -251,4 +253,3 @@ gclog_or_tty->print_cr("G1-Refine-stop"); } } -