2012-07-26 33 views
3

在此請大家幫忙傾倒每30秒,我想運行一個shell腳本,它應該採取java的堆轉儲使用kill命令-3每30秒。提前致謝。如何利用java的堆使用kill -3 <pid>命令

+0

你看過[cron](http://stackoverflow.com/questions/9619362/running-a-cron-every-30-seconds)? – Thomas 2012-07-26 12:39:08

+0

@Thomas使用'cron'每30秒觸發一次? – 2012-07-26 13:00:39

+0

確實,cron只能每60秒降低一次。 – Thomas 2012-07-27 02:24:34

回答

7

您是否嘗試過這樣一個簡單的shell腳本?

while true 
do 
    jmap -dump:file=/tmp/java-`date +%s`.hprof PID_OF_JVM 
    sleep 30 
done 

這會爲每個快照創建一個文件梨。對於線程轉儲,您可以使用類似的腳本:

while true 
do 
    jstack PID_OF_JVM > stack-`date +%s`.txt 
    sleep 30 
done 

我想你可以使用kill -3代替jstack

+1

+1,但殺死-3不會轉儲堆棧到您從運行控制檯,不像jstack – 2012-07-26 12:41:31

+0

@BrianAgnew:謝謝,我想先用殺'-3'但我認爲這是我的錯,我不能請參閱堆棧轉儲。 – 2012-07-26 12:43:24

+0

殺-3將它轉儲到進程的標準輸出(ERR?),但jstack似乎它轉儲到jstack的控制檯 – 2012-07-26 12:49:26

3

你可以做的線程使用這樣

public static String getDumpFor(Thread thread) { 
    StringBuilder sb = new StringBuilder(); 
    if (thread.isAlive()) { 
     StackTraceElement[] stackTrace = thread.getStackTrace(); 
     sb.append(thread.toString()).append("\n") 
       .append(String.format(" State - %s,", thread.getState())) 
       .append(String.format(" Is daemon = %s,", thread.isDaemon())); 
     for (StackTraceElement s : stackTrace) 
      sb.append("\tat ").append(s.getClassName()).append(".").append(s.getMethodName()).append("(").append(s.getFileName()).append(":").append(s.getLineNumber()).append(")") 
        .append("\n"); 
    } 
    return sb.toString(); 
} 


public static void dumpActiveThreads() { 
    Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces(); 
    Set<Thread> keySet = stackTraces.keySet(); 
    System.out.println("\nThread dump begin:"); 
    for (Thread thread : keySet) 
     dumpActiveThread(thread); 
    System.out.println("\nThread dump end."); 

} 

,然後像這樣

final ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(
      new Runnable() {dumpActiveThreads()}, 
      0, 
      30, TimeUnit.SECONDS); 
1

計劃任務的代碼我沒有使用過kill -3命令,但我已經使用提供jmap命令從Java應用程序傾銷通過sun sdk

您可以編寫一個腳本,然後在下面的腳本命令來運行。

${JAVA_HOME}/bin/jmap -dump:file=/home/MyDump.hprof PID 
0

3將只給出線程轉儲,但不是堆dump.Thread轉儲意味着你只能檢查堆棧跟蹤在JVM.But您是堆轉儲在Linux上則需要看着G中的每個線程使用下面的命令。 JMAP轉儲:文件= {myheap.bin PID其中你正在尋找採取堆轉儲}。輸出「myheap.bin」不是人類可讀的,讀取文件可以使用MAT工具。 MAT下載鏈接:http://www.eclipse.org/mat/