kill -3 コマンドを使用して、30 秒ごとに Java ヒープ ダンプを取得するシェル スクリプトを実行したいと考えています。前もって感謝します。
4 に答える
このような単純なシェル スクリプトを試したことはありますか?
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
。
このようなコードを使用して、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);
kill -3
コマンドは使用していませんが、jmap
提供されているコマンドを使用しましたsun sdk
スクリプトを記述してから、スクリプト内でコマンドの下で実行できます。
${JAVA_HOME}/bin/jmap -dump:file=/home/MyDump.hprof PID
3 はスレッド ダンプのみを提供し、ヒープ ダンプは提供しません。スレッド ダンプは、JVM 内の各スレッドのスタック トレースのみを確認できることを意味します。しかし、Linux でヒープ ダンプを探している場合は、以下のコマンドを使用する必要があります。jmap -dump:file=myheap.bin {ヒープ ダンプを取得しようとしている pid}。出力 "myheap.bin" は人間が判読できるものではありません。MAT ツールを使用してファイルを読み取ることができます。MAT ダウンロード リンク: http://www.eclipse.org/mat/