Hier ist, wie wir es programmatisch tun: http://pastebin.com/uS5jYpd4
Wir verwenden die JMX
ThreadMXBean
und ThreadInfo
Klassen:
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0);
...
Sie können auch eine kill -QUIT pid
unter ~ Unix zu tun, die Stapel auf die Standard-out-Dump . Es gibt auch Jstack, um den Stapel einer JVM zu entladen.
Wir auch eine Automatisierung haben, die den Stapel Dumps, wenn die durchschnittliche Belastung der Anwendung über eine bestimmte Schwelle ist:
private long lastCpuTimeMillis;
private long lastPollTimeMillis;
public void checkLoadAverage() {
long now = System.currentTimeMillis();
long currentCpuMillis = getTotalCpuTimeMillis();
double loadAvg = calcLoadAveragePercentage(now, currentCpuMillis);
if (loadAvg > LOAD_AVERAGE_DUMP_THRESHOLD) {
try {
dumpStack("Load average percentage is " + loadAvg);
} catch (IOException e) {
// Oh well, we tried
}
}
lastCpuTimeMillis = currentCpuMillis;
lastPollTimeMillis = now;
}
private long getTotalCpuTimeMillis() {
long total = 0;
for (long id : threadMxBean.getAllThreadIds()) {
long cpuTime = threadMxBean.getThreadCpuTime(id);
if (cpuTime > 0) {
total += cpuTime;
}
}
// since is in nano-seconds
long currentCpuMillis = total/1000000;
return currentCpuMillis;
}
private double calcLoadAveragePercentage(long now, long currentCpuMillis) {
long timeDiff = now - lastPollTimeMillis;
if (timeDiff == 0) {
timeDiff = 1;
}
long cpuDiff = currentCpuMillis - lastCpuTimeMillis;
double loadAvg = (double) cpuDiff/(double) timeDiff;
return loadAvg;
}
Thread.getAllStackTraces() wird Ihnen das meiste geben, was Sie wollen. Oder Sie können 'jstack {pid}' als externes Programm ausführen. –
Ich kann mir keine Möglichkeit vorstellen, einen Thread-Dump zu erstellen, der einen Neustart erfordert ....;) –
Thread.dumpStack() gibt Ihnen den Stack-Trace für den aktuellen Thread. –