|
42 | 42 |
|
43 | 43 | import java.io.IOException; |
44 | 44 | import java.lang.management.ManagementFactory; |
| 45 | +import java.lang.management.ThreadInfo; |
| 46 | +import java.lang.management.ThreadMXBean; |
45 | 47 | import java.nio.file.Files; |
46 | 48 | import java.nio.file.Path; |
47 | 49 | import java.util.ArrayList; |
@@ -120,15 +122,33 @@ private void dumpAndAnalyze() { |
120 | 122 | } |
121 | 123 |
|
122 | 124 | MBeanServer server = doFullGC(); |
| 125 | + String threadDump = getThreadDump(); |
123 | 126 | Path dumpFile = dumpHeap(server); |
124 | 127 | boolean fail = checkForLeaks(dumpFile); |
125 | 128 | if (fail) { |
| 129 | + System.err.print(threadDump); |
126 | 130 | System.exit(255); |
127 | 131 | } else { |
128 | 132 | System.exit(0); |
129 | 133 | } |
130 | 134 | } |
131 | 135 |
|
| 136 | + private String getThreadDump() { |
| 137 | + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); |
| 138 | + ThreadInfo[] threads = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100); |
| 139 | + final String line = "=====================================\n"; |
| 140 | + StringBuilder sb = new StringBuilder(line); |
| 141 | + for (ThreadInfo thread : threads) { |
| 142 | + sb.append("-------\n"); |
| 143 | + sb.append(thread.getThreadName()).append('\n'); |
| 144 | + sb.append("Thread state:").append(thread.getThreadState()).append('\n'); |
| 145 | + for (StackTraceElement element : thread.getStackTrace()) { |
| 146 | + sb.append(" ").append(element).append('\n'); |
| 147 | + } |
| 148 | + } |
| 149 | + return sb.append(line).toString(); |
| 150 | + } |
| 151 | + |
132 | 152 | private boolean checkForLeaks(Path dumpFile) { |
133 | 153 | boolean fail = false; |
134 | 154 | try { |
|
0 commit comments