--- old/src/hotspot/share/runtime/serviceThread.cpp 2018-09-18 20:43:10.347477874 -0400 +++ new/src/hotspot/share/runtime/serviceThread.cpp 2018-09-18 20:43:10.095464568 -0400 @@ -86,7 +86,6 @@ bool has_jvmti_events = false; bool has_gc_notification_event = false; bool has_dcmd_notification_event = false; - bool acs_notify = false; bool stringtable_work = false; bool symboltable_work = false; bool resolved_method_table_work = false; @@ -104,16 +103,17 @@ ThreadBlockInVM tbivm(jt); MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); - while (!(sensors_changed = LowMemoryDetector::has_pending_requests()) && - !(has_jvmti_events = JvmtiDeferredEventQueue::has_events()) && - !(has_gc_notification_event = GCNotifier::has_event()) && - !(has_dcmd_notification_event = DCmdFactory::has_pending_jmx_notification()) && - !(stringtable_work = StringTable::has_work()) && - !(symboltable_work = SymbolTable::has_work()) && - !(resolved_method_table_work = ResolvedMethodTable::has_work()) && - !(protection_domain_table_work = SystemDictionary::pd_cache_table()->has_work())) { - // wait until one of the sensors has pending requests, or there is a - // pending JVMTI event or JMX GC notification to post + // Use arithmetic-or to combine results; we don't want short-circuiting. + while (((sensors_changed = LowMemoryDetector::has_pending_requests()) | + (has_jvmti_events = JvmtiDeferredEventQueue::has_events()) | + (has_gc_notification_event = GCNotifier::has_event()) | + (has_dcmd_notification_event = DCmdFactory::has_pending_jmx_notification()) | + (stringtable_work = StringTable::has_work()) | + (symboltable_work = SymbolTable::has_work()) | + (resolved_method_table_work = ResolvedMethodTable::has_work()) | + (protection_domain_table_work = SystemDictionary::pd_cache_table()->has_work())) + == 0) { + // Wait until notified that there is some work to do. Service_lock->wait(Mutex::_no_safepoint_check_flag); }