--- old/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp 2018-04-13 11:50:02.192322359 +0200 +++ new/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp 2018-04-13 11:50:01.770309426 +0200 @@ -45,15 +45,12 @@ _closures(NULL), _plab_allocator(NULL), _age_table(false), -// _dest _tenuring_threshold(g1h->g1_policy()->tenuring_threshold()), _scanner(g1h, this), _hash_seed(17), _worker_id(worker_id), _stack_drain_upper_threshold(GCDrainStackTargetSize * 2 + 1), _stack_drain_lower_threshold(GCDrainStackTargetSize), -// _surviving_young_words(NULL), -// _surviving_young_words_base(NULL), _trim_ticks(), _old_gen_is_full(false) { @@ -145,16 +142,8 @@ void G1ParScanThreadState::trim_queue() { StarTask ref; do { - // Drain the overflow stack first, so other threads can steal. - while (_refs->pop_overflow(ref)) { - if (!_refs->try_push_to_taskqueue(ref)) { - dispatch_reference(ref); - } - } - - while (_refs->pop_local(ref)) { - dispatch_reference(ref); - } + // Fully drain the queue. + trim_queue_to_threshold(0); } while (!_refs->is_empty()); }