3

kill -3 コマンドを使用して、30 秒ごとに Java ヒープ ダンプを取得するシェル スクリプトを実行したいと考えています。前もって感謝します。

4

4 に答える 4

7

このような単純なシェル スクリプトを試したことはありますか?

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

これにより、スナップショットごとに 1 つのファイルが作成されます。スレッド ダンプについては、同様のスクリプトを使用できます。

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

kill -3の代わりに使えると思いますjstack

于 2012-07-26T12:39:13.313 に答える
5

このようなコードを使用して、Java アプリケーションからスレッド ダンプを実行できます。

 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);
于 2012-07-26T12:39:13.780 に答える
1

kill -3コマンドは使用していませんが、jmap提供されているコマンドを使用しましたsun sdk

スクリプトを記述してから、スクリプト内でコマンドの下で実行できます。

${JAVA_HOME}/bin/jmap -dump:file=/home/MyDump.hprof PID
于 2012-07-26T12:43:18.987 に答える
0

3 はスレッド ダンプのみを提供し、ヒープ ダンプは提供しません。スレッド ダンプは、JVM 内の各スレッドのスタック トレースのみを確認できることを意味します。しかし、Linux でヒープ ダンプを探している場合は、以下のコマンドを使用する必要があります。jmap -dump:file=myheap.bin {ヒープ ダンプを取得しようとしている pid}。出力 "myheap.bin" は人間が判読できるものではありません。MAT ツールを使用してファイルを読み取ることができます。MAT ダウンロード リンク: http://www.eclipse.org/mat/

于 2016-03-16T19:08:36.233 に答える