2009-08-12 2 views
8

私たちはJava 5を実行している長時間実行されているサーバーアプリケーションを持っており、それをプロファイリングすることで、古い世代が徐々に成長しているのがわかります。完全なGCで正しく解放されましたが、ヒープダンプを使用してEclipse MATの到達不能オブジェクトを調べることができるようにしたいと考えています。 + XX:HeapDumpOnCtrlBreakを使用してヒープダ​​ンプを取得しましたが、ヒープをダンプする前にJVMは常にGCを実行します。どうやらこれはJava 6では発生しませんが、現在は5に固執しています。これを防ぐ方法はありますか?最初にガベージ・コレクションを行わずにJava 5でヒープ・ダンプを取ることはできますか?

答えて

1

YourKitのような第三者プロファイラをお勧めします.GCを最初に開始することなくスナップショットを撮ることができます。追加ボーナス、あなたはctrl-break shenanigans全体なしでスナップショットを取ることができます。

+0

おかげで、私は実際にJProfilerをのコピーを持っているが、私はそれがこれを行うことが実現しませんでした。私はそれを行ってあげるよ。 – Colin

3

私はプログラム的にJMXを介して、ヒープ・ダンプを取ることができ、ここでいくつかのコードを持っている:

リンク:JmxHeapDumper.java

ソースコード内のコメントは、ヒープを取る方法についての有用な情報を含ま記事への2つのリンクが含まれていますダンプ。私は確かに分かりませんが、運が良ければ、おそらくJMXのアプローチはGCを回避する何らかの方法を持っています。お役に立てれば !

+0

すごく、ありがとう、私は見て、あらかじめGCかどうかを見てみましょう。プログラムでそれを行うことができることは、実際には非常に便利だと思われます。 – Colin

4

JDKに同梱の標準jmapツールを試しましたか? jmapの通行料が正式のJava 5で

を導入した例コマンドライン: /ジャワ/ binに/ jmapの-heap:フォーマット= B

結果は標準jhatツールまたはGUIアプリケーションで処理することができますMATなど。

9

jconsoleまたはvisualvmまたはjmcまたは他のjmx管理コンソールを使用します。 com.sun.managementのHotSpotDiagnosticを開きます。 選択方法dumpHeapと入力2つのパラメータ:

  • パスダンプ・ファイルへ
  • (真/偽)が唯一のライブオブジェクトをダンプします。 falseを使用してすべてのオブジェクトをダンプします。

ダンプファイルは、JVisualVMではなく、接続したJVMによって書き込まれるため、JVMが別のシステムで実行されている場合、そのシステムに書き込まれます。

enter image description here

+0

これは、JDKに含まれている通常のツールを使用しているだけなので、これは受け入れられる回答である必要があります。 – mjuarez

+1

VisualVMには、このために 'VisualVM-MBeans'プラグインが必要です。 – Natan

関連する問題