--- old/src/hotspot/share/gc/parallel/psCompactionManager.cpp 2019-12-03 11:25:09.975990403 +0100 +++ new/src/hotspot/share/gc/parallel/psCompactionManager.cpp 2019-12-03 11:25:09.603978851 +0100 @@ -172,24 +172,25 @@ } size_t ParCompactionManager::pop_shadow_region_mt_safe(PSParallelCompact::RegionData* region_ptr) { + MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); while (true) { - MutexLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); - if (_shadow_region_array->is_empty()) { - // Check if the corresponding heap region is available now. - // If so, we don't need to get a shadow region anymore, - // and we return 0 to indicate this case - if (region_ptr->claimed()) { - return 0; - } - } else { + if (!_shadow_region_array->is_empty()) { return _shadow_region_array->pop(); } + // Check if the corresponding heap region is available now. + // If so, we don't need to get a shadow region anymore, and + // we return InvalidShadow to indicate such a case. + if (region_ptr->claimed()) { + return InvalidShadow; + } + ml.wait(1); } } void ParCompactionManager::push_shadow_region_mt_safe(size_t shadow_region) { - MutexLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); + MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag); _shadow_region_array->push(shadow_region); + ml.notify(); } void ParCompactionManager::push_shadow_region(size_t shadow_region) {