Skip to content

Commit b5d62b4

Browse files
committed
Add off-by-default feature to automatically thread dump every 60 seconds
1 parent 74eb8a0 commit b5d62b4

File tree

3 files changed

+37
-18
lines changed

3 files changed

+37
-18
lines changed

common/src/main/java/org/embeddedt/modernfix/ModernFix.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
1212
import org.embeddedt.modernfix.resources.ReloadExecutor;
1313
import org.embeddedt.modernfix.util.ClassInfoManager;
14+
import org.embeddedt.modernfix.world.IntegratedWatchdog;
1415

1516
import java.lang.management.ManagementFactory;
1617
import java.util.concurrent.Executor;
@@ -46,6 +47,19 @@ public static Executor resourceReloadExecutor() {
4647
public ModernFix() {
4748
INSTANCE = this;
4849
ModernFixPlatformHooks.onServerCommandRegister(ModernFixCommands::register);
50+
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.spam_thread_dump.ThreadDumper")) {
51+
Thread t = new Thread() {
52+
public void run() {
53+
while(true) {
54+
LOGGER.error("------ DEBUG THREAD DUMP (occurs every 60 seconds) ------");
55+
LOGGER.error(IntegratedWatchdog.obtainThreadDump());
56+
try { Thread.sleep(60000); } catch(InterruptedException e) {}
57+
}
58+
}
59+
};
60+
t.setDaemon(true);
61+
t.start();
62+
}
4963
}
5064

5165
public void onServerStarted() {

common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ else if(isClientOnly && !ModernFixPlatformHooks.isClient())
147147
.put("mixin.perf.deduplicate_location", false)
148148
.put("mixin.feature.integrated_server_watchdog", true)
149149
.put("mixin.perf.faster_item_rendering", false)
150+
.put("mixin.feature.spam_thread_dump", false)
150151
.put("mixin.perf.blast_search_trees", shouldReplaceSearchTrees)
151152
.put("mixin.devenv", isDevEnv)
152153
.put("mixin.perf.remove_spawn_chunks", isDevEnv)

common/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,27 @@ public IntegratedWatchdog(MinecraftServer server) {
2525
this.setName("ModernFix integrated server watchdog");
2626
}
2727

28+
public static String obtainThreadDump() {
29+
ThreadMXBean threadmxbean = ManagementFactory.getThreadMXBean();
30+
ThreadInfo[] athreadinfo = threadmxbean.dumpAllThreads(true, true);
31+
StringBuilder sb = new StringBuilder();
32+
sb.append("Thread Dump:\n");
33+
for(ThreadInfo threadinfo : athreadinfo) {
34+
sb.append(threadinfo);
35+
StackTraceElement[] elements = threadinfo.getStackTrace();
36+
if(elements.length > 8) {
37+
sb.append("extended trace:\n");
38+
for(int i = 8; i < elements.length; i++) {
39+
sb.append("\tat ");
40+
sb.append(elements[i]);
41+
sb.append('\n');
42+
}
43+
}
44+
sb.append('\n');
45+
}
46+
return sb.toString();
47+
}
48+
2849
public void run() {
2950
while(true) {
3051
MinecraftServer server = this.server.get();
@@ -35,24 +56,7 @@ public void run() {
3556
long delta = curTime - nextTick;
3657
if(delta > MAX_TICK_DELTA) {
3758
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
38-
ThreadMXBean threadmxbean = ManagementFactory.getThreadMXBean();
39-
ThreadInfo[] athreadinfo = threadmxbean.dumpAllThreads(true, true);
40-
StringBuilder sb = new StringBuilder();
41-
sb.append("Thread Dump:\n");
42-
for(ThreadInfo threadinfo : athreadinfo) {
43-
sb.append(threadinfo);
44-
StackTraceElement[] elements = threadinfo.getStackTrace();
45-
if(elements.length > 8) {
46-
sb.append("extended trace:\n");
47-
for(int i = 8; i < elements.length; i++) {
48-
sb.append("\tat ");
49-
sb.append(elements[i]);
50-
sb.append('\n');
51-
}
52-
}
53-
sb.append('\n');
54-
}
55-
LOGGER.error(sb);
59+
LOGGER.error(obtainThreadDump());
5660
nextTick = 0;
5761
curTime = 0;
5862
}

0 commit comments

Comments
 (0)