--- old/src/hotspot/share/runtime/vframe.cpp 2020-02-03 17:39:47.000000000 -0500 +++ new/src/hotspot/share/runtime/vframe.cpp 2020-02-03 17:39:46.000000000 -0500 @@ -122,8 +122,15 @@ if (mons->is_empty()) return result; bool found_first_monitor = false; - ObjectMonitor *pending_monitor = thread()->current_pending_monitor(); - ObjectMonitor *waiting_monitor = thread()->current_waiting_monitor(); + // For all of the javaVFrame::locked_monitors()() call sites, we + // are either at a safepoint or the calling thread is operating + // on itself so this ObjectMonitorHandle is not strictly necessary. + ObjectMonitorHandle omh; + ObjectMonitor *waiting_monitor = thread()->current_waiting_monitor(&omh); + ObjectMonitor *pending_monitor = NULL; + if (waiting_monitor == NULL) { + pending_monitor = thread()->current_pending_monitor(&omh); + } oop pending_obj = (pending_monitor != NULL ? (oop) pending_monitor->object() : (oop) NULL); oop waiting_obj = (waiting_monitor != NULL ? (oop) waiting_monitor->object() : (oop) NULL); @@ -231,9 +238,12 @@ // an inflated monitor that is first on the monitor list in // the first frame can block us on a monitor enter. markWord mark = monitor->owner()->mark(); + // The calling thread is operating on itself so this + // ObjectMonitorHandle is not strictly necessary. + ObjectMonitorHandle omh; if (mark.has_monitor() && ( // we have marked ourself as pending on this monitor - mark.monitor() == thread()->current_pending_monitor() || + mark.monitor() == thread()->current_pending_monitor(&omh) || // we are not the owner of this monitor !mark.monitor()->is_entered(thread()) )) {