2015-12-03 6 views
12

いくつかのJavaプロセスがあり、OOMエラーが発生したときに作成されたヒープダンプを管理しようとしています。私が管理すると言うとき、私はJavaメモリ不足自動ヒープダンプファイル名

  • 名前を意味ヒープダンプ異なり、元のプロセス
  • に基づいてヒープが

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp 
    
    でOOMにヒープをダンプすると、ディスク領域に

を維持するためにダンプ古い削除

JVMは、指定された/ tmpフォルダ(XXXXはプロセスのPID)にjava_pidXXXX.hprofという名前のファイルを作成します。 ファイル名の作成にPIDとDATEを使用する別の形式を指定する必要はありますか? 1時間のグーグルでmyPrefix_ $、{pid}、 'date'などを試しました。仕事が

  1. ファイル名を指定していないとあなたがjava_pidXXXX.hprof
  2. は、例えば、静的なファイル名を指定して取得 2つだけ\ tmp \ OOM.hprof。

の\ tmpフォルダは、それが作成されない、またヒープ・ダンプが作成されますが存在しない場合。使用することができます

1つのアイデアは、OOMエラー

-XX:OnOutOfMemoryError="doSomething.sh %p" 

にコマンドを追加することですが、私は「doSomething.sh」

+1

名前に日付が必要なのはなぜですか?古いファイルを削除する場合は、ファイルの変更時刻までに古いファイルを削除することができます。名前に日付は必要ありません。 – RealSkeptic

答えて

4

-XX:HeapDumpPathはあなたがすでに発見したものよりも、それ以上の柔軟性を与えるものではありません。それはあなたができる、次のいずれかです。

  • ディレクトリ名を設定し、デフォルトの名前java_pidXXX.hprofがそのディレクトリに作成されます。
  • ファイル名を設定すると、そのファイルはそのまま使用されます。

ホットスポットソースの関連コードはheapDumper.cppです。それを読んで、指定されたパスの中の "マジックシーケンス"を探すことはありません:

  • これは、指定されたパスがディレクトリであるかどうかをチェックします。そうであれば、それをプレフィックスとして使用し、ファイル区切りを追加し、ハードコードされた部分で構成されたデフォルトのファイル名を使用します。
  • ディレクトリでない場合はそのままそのまま使用します。
  • このJVMの最初のダンプでない場合は、シーケンス番号も追加されます。

これだけです。それがディレクトリかどうかを判断する以上のパスの解析はありません。

これに追加できる柔軟性は、コマンドラインで名前を構築するときにシェルの機能を使用することだけです。だから、name_`date`.extのようなものを使ったウェブ上のいくつかの例を見ることができます。これは、シェルによって処理され、現在の日付であるに置き換えます。つまり、ファイル名には、シェルがコマンドを処理してJVMを起動した日時が常に含まれます。ダンプが作成された日時ではありません。それがあなたのために十分であれば、それを使うことができます。最近では、構文name_$(date).extを使用する方が受け入れられると考えられていることに注意してください。

古いファイルを削除できるようにするには日付が必要な場合は、ファイルの最終更新時刻(Unix/Linuxユーティリティfindがそれに役立つ)に基づいて古いファイルを削除することができます。名前に日付を付ける必要はありません。

$(date)(または`date`)のトリックは、PIDに役立つものではありません。シェルは、$$を使用する場合、現在のPIDを代用することもできますが、コマンドラインを処理するシェルのPIDであり、JVMプロセス自体ではありません。ただし、シェルexecコマンドを使用してJavaアプリケーションを起動すると、元のシェルと同じプロセスIDが返されるため、実際には$$を使用してファイル名を作成できます。あなたのスクリプトからexecの後に何も実行されないことを覚えておいてください。

@apanginが答えてくれたファイル名を動的に変更してみてください。ただし、OOMが実際に実行される前にファイル名を設定したいので、ダンプ自体の時間を正確に特定するのはおそらく少し難しいでしょう。

6

HeapDumpPathがあるが展開する必要があるように私はそれを避けるためにしようとしていました管理可能なVMオプション。つまり、JMXを使用して実行時に任意の値に設定できます。コマンドラインで

String pid = ManagementFactory.getRuntimeMXBean().getName(); 
    pid = pid.substring(0, pid.indexOf('@')); 
    String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); 
    String fileName = "/tmp/heap_" + pid + "_" + date + ".dump"; 

    HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
      ManagementFactory.getPlatformMBeanServer(), 
      "com.sun.management:type=HotSpotDiagnostic", 
      HotSpotDiagnosticMXBean.class); 
    bean.setVMOption("HeapDumpOnOutOfMemoryError", "true"); 
    bean.setVMOption("HeapDumpPath", fileName);