Generare un dump del thread Java senza riavviare.

Mi piacerebbe creare un thread che tiene traccia dell’utilizzo della memoria e dell’utilizzo della CPU.

Se l’applicazione raggiunge un livello elevato, voglio generare un dump dell’heap o un dump del thread.

C’è un modo per generare un runtime del dump del thread senza riavviare?

Ecco come lo facciamo a livello di codice: http://pastebin.com/uS5jYpd4

Utilizziamo le classi ThreadMXBean e ThreadInfo JMX :

 ThreadMXBean mxBean = ManagementFactory.getThreadMXBean(); ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0); ... 

Puoi anche fare un kill -QUIT pid sotto ~ unix per scaricare gli stack nello standard-out. C’è anche jstack per scaricare lo stack di una JVM.

Abbiamo anche un’automazione che scarica lo stack se il carico medio dell’applicazione supera una 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; } 

Per scaricare i thread allo standard, puoi fare qualcosa di simile

 ThreadInfo[] threads = ManagementFactory.getThreadMXBean() .dumpAllThreads(true, true); for(final ThreadInfo info : threads) System.out.print(info); 

in Java 6 usando la class ThreadMXBean . Ma suggerirei di usare la registrazione reale invece dello standard output.

Prova “kill -QUIT” Process_id es

 kill -QUIT 2134 

Ciò attiverà il dump del thread senza riavviarlo

Sì, è ansible generare il proprio dump dello stack utilizzando la gestione incorporata MXBeans. In particolare, è ansible ottenere tutti i ThreadInfos correnti da ThreadMXBean e scrivere i contenuti nella posizione desiderata.