Así es como lo hacemos mediante programación: http://pastebin.com/uS5jYpd4
usamos el JMX
ThreadMXBean
y ThreadInfo
clases:
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0);
...
También puede hacer un kill -QUIT pid
en ~ Unix para volcar las pilas a la norma de salida . También hay jstack para volcar la pila de una JVM.
También tenemos una automatización que vuelca la pila si el promedio de carga de la aplicación está por encima de cierto umbral:
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() le dará la mayor parte de lo que desee. O puede ejecutar 'jstack {pid}' como un programa externo. –
No puedo pensar en una forma de producir un volcado de hilo que requiera un reinicio ....;) –
Thread.dumpStack() le dará el seguimiento de pila para el hilo actual. –