diff -r bf9fa29bb3dc -r bf8128faace1 src/hotspot/share/gc/shenandoah/shenandoahStringDedup.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.cpp Mon Jul 22 10:26:21 2019 -0700 +++ b/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.cpp Sat Jul 13 12:15:17 2019 -0400 @@ -75,16 +75,20 @@ assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); assert(is_enabled(), "String deduplication not enabled"); - ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); - StringDedupUnlinkOrOopsDoClosure sd_cl(is_alive, cl); + if (ShenandoahGCPhase::is_root_work_phase()) { + ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); + { + ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id); + StringDedupQueue::unlink_or_oops_do(&sd_cl); + } - { - ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id); + { + ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupTableRoots, worker_id); + StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id); + } + } else { StringDedupQueue::unlink_or_oops_do(&sd_cl); - } - { - ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupTableRoots, worker_id); StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id); } }