|
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