--- old/src/hotspot/share/runtime/deoptimization.cpp Mon Oct 9 11:13:45 2017 +++ new/src/hotspot/share/runtime/deoptimization.cpp Mon Oct 9 11:13:45 2017 @@ -50,6 +50,7 @@ #include "runtime/signature.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/thread.hpp" +#include "runtime/threadSMR.hpp" #include "runtime/vframe.hpp" #include "runtime/vframeArray.hpp" #include "runtime/vframe_hp.hpp" @@ -1303,22 +1304,26 @@ assert(SafepointSynchronize::is_at_safepoint(), "must only be called from safepoint"); GrowableArray* objects_to_revoke = new GrowableArray(); - for (JavaThread* jt = Threads::first(); jt != NULL ; jt = jt->next()) { - if (jt->has_last_Java_frame()) { - StackFrameStream sfs(jt, true); - while (!sfs.is_done()) { - frame* cur = sfs.current(); - if (cb->contains(cur->pc())) { - vframe* vf = vframe::new_vframe(cur, sfs.register_map(), jt); - compiledVFrame* cvf = compiledVFrame::cast(vf); - // Revoke monitors' biases in all scopes - while (!cvf->is_top()) { + { + ThreadsListHandle tlh; + JavaThreadIterator jti(tlh.list()); + for (JavaThread* jt = jti.first(); jt != NULL; jt = jti.next()) { + if (jt->has_last_Java_frame()) { + StackFrameStream sfs(jt, true); + while (!sfs.is_done()) { + frame* cur = sfs.current(); + if (cb->contains(cur->pc())) { + vframe* vf = vframe::new_vframe(cur, sfs.register_map(), jt); + compiledVFrame* cvf = compiledVFrame::cast(vf); + // Revoke monitors' biases in all scopes + while (!cvf->is_top()) { + collect_monitors(cvf, objects_to_revoke); + cvf = compiledVFrame::cast(cvf->sender()); + } collect_monitors(cvf, objects_to_revoke); - cvf = compiledVFrame::cast(cvf->sender()); } - collect_monitors(cvf, objects_to_revoke); + sfs.next(); } - sfs.next(); } } }