@Override public int compare(MonitorInfo a, MonitorInfo b) { return b.getLockedStackDepth() - a.getLockedStackDepth(); } });
/** * Create data transfer object for given monitor info. * * @param mi Monitoring info. */ public VisorThreadMonitorInfo(MonitorInfo mi) { super(mi); stackDepth = mi.getLockedStackDepth(); stackFrame = mi.getLockedStackFrame(); }
lockedMonitorJson.put("Class", lockedMonitor.getClassName()); lockedMonitorJson.put("IdentityHashCode", lockedMonitor.getIdentityHashCode()); lockedMonitorJson.put("LockedStackDepth", lockedMonitor.getLockedStackDepth()); lockedMonitorJson.put("StackFrame", lockedMonitor.getLockedStackFrame().toString()); lockedMonitorsJson.add(lockedMonitorJson);
private static String getObjectName(MonitorInfo info) { return info.getClassName() + "@" + Integer.toHexString(info.getIdentityHashCode()); }
private Map<String, Object> getDeadLockThreadInformation(ThreadMXBean threadMXBean) { LinkedHashMap<String, Object> json = new LinkedHashMap<>(); long[] deadlockedThreads = threadMXBean.findDeadlockedThreads(); if (deadlockedThreads != null && deadlockedThreads.length > 0) { json.put("Count", deadlockedThreads.length); for (long deadlockedThread : deadlockedThreads) { LinkedHashMap<String, Object> threadsInfo = new LinkedHashMap<>(); LinkedHashMap<String, Object> lockedMonitorsInfo = new LinkedHashMap<>(); LinkedHashMap<String, Object> stackTrackInfo = new LinkedHashMap<>(); ThreadInfo threadInfo = threadMXBean.getThreadInfo(deadlockedThread); LockInfo lockInfo = threadInfo.getLockInfo(); if (lockInfo != null) { threadsInfo.put(threadInfo.getThreadName(), lockInfo); } else { threadsInfo.put(threadInfo.getThreadName(), "This thread is not waiting for any locks"); } MonitorInfo[] lockedMonitors = threadInfo.getLockedMonitors(); for (MonitorInfo lockedMonitor : lockedMonitors) { lockedMonitorsInfo.put("Monitor for class " + lockedMonitor.getClassName(), "taken at stack frame " + lockedMonitor.getLockedStackFrame()); } stackTrackInfo.put(Long.toString(deadlockedThread), Arrays.toString(threadInfo.getStackTrace())); json.put("Thread Information", threadsInfo); json.put("Monitor Information Stack Frame where locks were taken", lockedMonitorsInfo); json.put("Stack Trace Of DeadLock Threads", stackTrackInfo); } } return json; }
int lockedStackDepth = lockedMonitor.getLockedStackDepth(); if (lockedStackDepth >= 0) { stackTraceElements.get(lockedStackDepth) .addMonitorInfo(ThreadDump.LockInfo.newBuilder() .setClassName(lockedMonitor.getClassName()) .setIdentityHashCode(lockedMonitor.getIdentityHashCode()));
MonitorInfo[] mis = ti.getLockedMonitors(); for (int i = 0; i < mis.length; i++) { monitorDepths[mis[i].getLockedStackDepth()] = mis[i]; MonitorInfo mi = (MonitorInfo)monitorDepths[i]; sb.append(INDENT2 + "- locked (a " + mi.toString() + ")"+ " index " + mi.getLockedStackDepth() + " frame " + mi.getLockedStackFrame().toString()); sb.append(CRLF);
private static String fullStackTrace(final ThreadInfo ti) { final StringBuilder sb = new StringBuilder(); Stream.of( ti.getStackTrace() ) .forEach( ste -> { sb.append(" "); sb.append(ste.toString()); sb.append("\n"); Stream.of( ti.getLockedMonitors() ) .filter( m -> ste.equals(m.getLockedStackFrame()) ) .forEach( lm -> { sb.append(" (locked: "); sb.append(lm); sb.append(" )\n"); }); }); return sb.toString(); }
sb.append('\n'); for (final MonitorInfo monitorInfo : monitorInfos) { final StackTraceElement lockedFrame = monitorInfo.getLockedStackFrame(); if (lockedFrame != null && lockedFrame.equals(element)) { sb.append("\t- locked <0x"); sb.append(Integer.toHexString(monitorInfo.getIdentityHashCode())); sb.append("> (a "); sb.append(monitorInfo.getClassName()); sb.append(")"); sb.append('\n');
public static boolean isMonitorOwner( Thread thread, Object monitor ) { if( thread == Thread.currentThread() && Thread.holdsLock( monitor ) ) { return true; } ThreadInfo ti = ManagementFactory.getThreadMXBean().getThreadInfo( new long[]{thread.getId()}, true, false )[0]; for( java.lang.management.MonitorInfo mi : ti.getLockedMonitors() ) { if( mi.getIdentityHashCode() == System.identityHashCode( monitor ) ) { return true; } } return false; }
private void jsonDumpMonitors(StringBuilder sb, MonitorInfo[] lockedMonitors) { if (lockedMonitors == null || lockedMonitors.length == 0) return; sb.append(",\n \"monitors\" : [\n"); for (int i = 0; i < lockedMonitors.length; i++) { MonitorInfo info = lockedMonitors[i]; if (i != 0) sb.append(",\n"); sb.append(" {\n"); sb.append(" \"depth\" : " + info.getLockedStackDepth()); sb.append(",\n \"class\" : \"" + info.getClassName() + "\""); sb.append(",\n \"hash\" : \"" + info.getIdentityHashCode() + "\""); sb.append(" }"); } sb.append("\n ]"); }
MonitorInfo[] mis = ti.getLockedMonitors(); for (int i = 0; i < mis.length; i++) { monitorDepths[mis[i].getLockedStackDepth()] = mis[i]; MonitorInfo mi = (MonitorInfo)monitorDepths[i]; sb.append(INDENT2 + "- locked (a " + mi.toString() + ")"+ " index " + mi.getLockedStackDepth() + " frame " + mi.getLockedStackFrame().toString()); sb.append(CRLF);
private String generateThreadStack(ThreadInfo info) { // This is annoying, but the to string method on info sucks. StringBuilder result = new StringBuilder(); result.append(info.getThreadName()).append(" ID=0x") .append(Long.toHexString(info.getThreadId())).append("(").append(info.getThreadId()) .append(") state=").append(info.getThreadState()); if (info.getLockInfo() != null) { result.append("\n\twaiting to lock <" + info.getLockInfo() + ">"); } for (StackTraceElement element : info.getStackTrace()) { result.append("\n\tat " + element); for (MonitorInfo monitor : info.getLockedMonitors()) { if (element.equals(monitor.getLockedStackFrame())) { result.append("\n\tlocked <" + monitor + ">"); } } } if (info.getLockedSynchronizers().length > 0) { result.append("\nLocked synchronizers:"); for (LockInfo sync : info.getLockedSynchronizers()) { result.append( "\n" + sync.getClassName() + "@" + Integer.toHexString(sync.getIdentityHashCode())); } } return result.toString(); }
sb.append('\n'); for (final MonitorInfo monitorInfo : monitorInfos) { final StackTraceElement lockedFrame = monitorInfo.getLockedStackFrame(); if (lockedFrame != null && lockedFrame.equals(element)) { sb.append("\t- locked <0x"); sb.append(Integer.toHexString(monitorInfo.getIdentityHashCode())); sb.append("> (a "); sb.append(monitorInfo.getClassName()); sb.append(")"); sb.append('\n');
public static void dumpThreads(PrintStream out) { ThreadInfo[] threads = ManagementFactory.getThreadMXBean() .dumpAllThreads(true, true); for(final ThreadInfo info : threads) { out.println("Thread: " + info.getThreadId() + "/" + info.getThreadName() + " in State " + info.getThreadState().name()); if(info.getLockName() != null) { out.println("- Waiting on lock: " + info.getLockInfo().toString() + " held by " + info.getLockOwnerId()+"/"+info.getLockOwnerName()); } for(MonitorInfo mi : info.getLockedMonitors()) { out.println(" Holds a lock on a " + mi.getClassName() + " from " + mi.getLockedStackFrame().getClassName()+"."+mi.getLockedStackFrame().getMethodName() + ": " + mi.getLockedStackFrame().getLineNumber()); } for(StackTraceElement elm : info.getStackTrace()) { out.println(" at " + elm.getClassName() + "." + elm.getMethodName() + ":"+elm.getLineNumber()); } out.println(); } }
private static String getObjectName(MonitorInfo info) { return info.getClassName() + "@" + Integer.toHexString(info.getIdentityHashCode()); }
Object lock = ... ThreadMXBean mx = ManagementFactory.getThreadMXBean(); ThreadInfo[] allInfo = mx.dumpAllThreads(true, false); for (ThreadInfo threadInfo : allInfo) { MonitorInfo[] monitors = threadInfo.getLockedMonitors(); for (MonitorInfo monitorInfo : monitors) { if (monitorInfo.getIdentityHashCode() == System.identityHashCode(lock)) { StackTraceElement[] stackTrace = threadInfo.getStackTrace(); // use the the Information from threadInfo } } }
private void printMonitors( List<String> list, MonitorInfo[] monitors, int index ) { if ( monitors != null ) for ( MonitorInfo mi : monitors ) if ( mi.getLockedStackDepth() == index ) { StringBuilder sb = new StringBuilder(100); sb.append("\t- locked "); printLock(sb, mi); list.add(sb.toString()); } }
/** * Create data transfer object for given monitor info. * * @param mi Monitoring info. */ public VisorThreadMonitorInfo(MonitorInfo mi) { super(mi); stackDepth = mi.getLockedStackDepth(); stackFrame = mi.getLockedStackFrame(); }
/** Create data transfer object for given monitor info. */ public static VisorThreadMonitorInfo from(MonitorInfo mi) { assert mi != null; return new VisorThreadMonitorInfo(mi.getClassName(), mi.getIdentityHashCode(), mi.getLockedStackDepth(), mi.getLockedStackFrame()); }