Ecco come lo facciamo a livello di codice: http://pastebin.com/uS5jYpd4
usiamo il JMX
ThreadMXBean
e ThreadInfo
classi:
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0);
...
si può anche fare un kill -QUIT pid
sotto ~ unix per scaricare le pile allo standard-out . C'è anche jstack per scaricare lo stack di una JVM.
Abbiamo anche un'automazione che scarica la pila se il carico medio della domanda supera una certa soglia:
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() ti darà la maggior parte di ciò che desideri. Oppure puoi eseguire 'jstack {pid}' come programma esterno. –
Non riesco a pensare a un modo per produrre un dump di thread che richiede un riavvio ....;) –
Thread.dumpStack() ti darà la traccia dello stack per il thread corrente. –