--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/OopUtilities.java 2018-11-30 12:31:55.289361385 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/OopUtilities.java 2018-11-30 12:31:55.111361376 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,16 +63,16 @@ private static BooleanField threadDaemonField; // possible values of java_lang_Thread::ThreadStatus - private static int THREAD_STATUS_NEW; + public static int THREAD_STATUS_NEW; - private static int THREAD_STATUS_RUNNABLE; - private static int THREAD_STATUS_SLEEPING; - private static int THREAD_STATUS_IN_OBJECT_WAIT; - private static int THREAD_STATUS_IN_OBJECT_WAIT_TIMED; - private static int THREAD_STATUS_PARKED; - private static int THREAD_STATUS_PARKED_TIMED; - private static int THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER; - private static int THREAD_STATUS_TERMINATED; + public static int THREAD_STATUS_RUNNABLE; + public static int THREAD_STATUS_SLEEPING; + public static int THREAD_STATUS_IN_OBJECT_WAIT; + public static int THREAD_STATUS_IN_OBJECT_WAIT_TIMED; + public static int THREAD_STATUS_PARKED; + public static int THREAD_STATUS_PARKED_TIMED; + public static int THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER; + public static int THREAD_STATUS_TERMINATED; // java.util.concurrent.locks.AbstractOwnableSynchronizer fields private static OopField absOwnSyncOwnerThreadField; --- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java 2018-11-30 12:31:55.711361408 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java 2018-11-30 12:31:55.531361398 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -106,6 +106,9 @@ StackValue sv = locs.get(0); if (sv.getType() == BasicType.getTObject()) { OopHandle o = sv.getObject(); + if (OopUtilities.threadOopGetThreadStatus(thread.getThreadObj()) == OopUtilities.THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER) { + waitState = "waiting to re-lock in wait()"; + } printLockedObjectClassName(tty, o, waitState); } } else { @@ -146,13 +149,6 @@ // an inflated monitor that is first on the monitor list in // the first frame can block us on a monitor enter. lockState = identifyLockState(monitor, "waiting to lock"); - } else if (frameCount != 0) { - // This is not the first frame so we either own this monitor - // or we owned the monitor before and called wait(). Because - // wait() could have been called on any monitor in a lower - // numbered frame on the stack, we have to check all the - // monitors on the list for this frame. - lockState = identifyLockState(monitor, "waiting to re-lock in wait()"); } printLockedObjectClassName(tty, monitor.owner(), lockState); foundFirstMonitor = true;