2012-07-26 2 views
3

kill-3 명령을 사용하여 30 초마다 jave 힙 덤프를 수행해야하는 셸 스크립트를 실행하고 싶습니다. 미리 감사드립니다.죽이기 -명령을 사용하여 jave 힙 덤프를 취하는 방법

+0

[cron] (http://stackoverflow.com/questions/9619362/running-a-cron-every-30-seconds)을 보았습니까? – Thomas

+0

@Thomas 'cron'을 사용하여 30 초마다 트리거합니까? –

+0

사실, cron은 매 60 초마다 내려갈 수 있습니다. – Thomas

답변

7

간단한 쉘 스크립트를 사용해 보셨습니까?

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

이렇게하면 각 스냅 샷마다 하나의 파일 배가 생성됩니다. 난 당신이 대신 jstackkill -3을 사용할 수 있습니다 생각

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

: 스레드 덤프 위해 당신은 유사한 스크립트를 사용할 수 있습니다.

+1

+1하지만 kill -3은 jstack과는 달리 스택을 실행하는 콘솔에 덤프하지 않습니다. –

+0

@BrianAgnew : 감사합니다. 저는'kill -3'으로 먼저 시도했지만, 제 잘못이라고 생각했습니다. 스택 덤프를 참조하십시오. –

+0

kill -3은 프로세스 'stdout (err?)에 덤프하지만 jstack은 jstack의 콘솔에 덤프하는 것으로 나타납니다 –

3

당신은 내가 kill -3 명령을 사용하지 않은하지만 난 제공 jmap 명령을 사용한이

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

등이 다음

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."); 

} 

및 예약 작업과 같은 코드를 사용하여 자바 응용 프로그램에서 덤핑 스레드를 할 수 by sun sdk

스크립트를 작성한 다음 스크립트에서 실행할 수 있습니다.

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

3 만 스레드 덤프를 줄 것이다하지만 힙 dump.Thread 덤프는 단지 당신이 리눅스 후 필요에 힙 덤프 g을 찾고있는 JVM.But 각 스레드에 대한 스택 추적을 확인할 수 있습니다 의미 아래 명령을 사용하십시오. jmap -dump : file = myheap.bin {힙 덤프를 얻으려고하는 pid}. 출력 "myheap.bin"은 사람이 읽을 수 없으므로 MAT 도구를 사용할 수있는 파일을 읽습니다. MAT 다운로드 링크 : http://www.eclipse.org/mat/

관련 문제