From 7bef4ce3e71e7457501867f0181cf3df37f6e558 Mon Sep 17 00:00:00 2001 From: Ross Allan Date: Sat, 13 Jul 2013 23:49:39 +0100 Subject: [PATCH] Remove lock contention profiling debugging, display more useful traces Signed-off-by: Ross Allan --- .../minecraft/commands/ProfileCommand.java | 3 +- .../profiling/ContentionProfiler.java | 44 +++++++++++++------ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/common/nallar/tickthreading/minecraft/commands/ProfileCommand.java b/src/common/nallar/tickthreading/minecraft/commands/ProfileCommand.java index 18648856..0fda63db 100644 --- a/src/common/nallar/tickthreading/minecraft/commands/ProfileCommand.java +++ b/src/common/nallar/tickthreading/minecraft/commands/ProfileCommand.java @@ -48,7 +48,8 @@ public void processCommand(final ICommandSender commandSender, List argu return; } if ("l".equals(arguments.get(0))) { - new ContentionProfiler(commandSender, 30, 5); + sendChat(commandSender, "Performing lock contention profiling for 10 minutes."); + new ContentionProfiler(commandSender, 240, 11); return; } entity_ = "e".equals(arguments.get(0)); diff --git a/src/common/nallar/tickthreading/minecraft/profiling/ContentionProfiler.java b/src/common/nallar/tickthreading/minecraft/profiling/ContentionProfiler.java index 87f6cf34..21950413 100644 --- a/src/common/nallar/tickthreading/minecraft/profiling/ContentionProfiler.java +++ b/src/common/nallar/tickthreading/minecraft/profiling/ContentionProfiler.java @@ -4,7 +4,6 @@ import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -75,26 +74,29 @@ private void profile(int ticks) { List threads = new ArrayList(); for (Thread thread : Thread.getAllStackTraces().keySet()) { if (thread instanceof ThreadMinecraftServer) { - Log.info("Using thread " + thread); threads.add(thread.getId()); } } - Log.info("Ticks " + ticks + " at " + resolution + "ms resolution."); this.threads = Longs.toArray(threads); - Log.info(Arrays.toString(this.threads)); while (ticks --> 0) { - tick(); - try { - Thread.sleep(resolution, 0); - } catch (InterruptedException e) { - Log.severe("Interrupted in profiling", e); - return; + long r = resolution - tick(); + + if (r > 0) { + try { + Thread.sleep(r, 0); + } catch (InterruptedException e) { + Log.severe("Interrupted in profiling", e); + return; + } + } else if (r < -10) { + ticks--; } } } - private void tick() { - ThreadInfo[] threads = ManagementFactory.getThreadMXBean().getThreadInfo(this.threads, true, true); + private long tick() { + long t = System.currentTimeMillis(); + ThreadInfo[] threads = ManagementFactory.getThreadMXBean().getThreadInfo(this.threads, 4); for (ThreadInfo thread : threads) { if (thread == null) { continue; @@ -108,11 +110,25 @@ private void tick() { if (lockInfo != null) { (ts == Thread.State.BLOCKED ? monitorMap : waitingMap).get(lockInfo.toString()).value++; } - StackTraceElement stackTraceElement = thread.getStackTrace()[0]; - traceMap.get(stackTraceElement.getClassName() + '.' + stackTraceElement.getMethodName()).value++; + StackTraceElement stackTraceElement = getTrace(thread.getStackTrace()); + if (stackTraceElement != null) { + traceMap.get(stackTraceElement.getClassName() + '.' + stackTraceElement.getMethodName()).value++; + } break; } } + return System.currentTimeMillis() - t; + } + + private static StackTraceElement getTrace(final StackTraceElement[] stackTrace) { + for (StackTraceElement stackTraceElement : stackTrace) { + String className = stackTraceElement.getClassName(); + if (className.startsWith("java") || className.startsWith("sun.")) { + continue; + } + return stackTraceElement; + } + return null; } private static class IntHashMap extends HashMap {