2010-12-31 20 views
1

私はプロファイリングについて少し知っていますが、私が特に関心を持っているのは、フロー例外を越えてこれらのヒープを取得するときに、すべてのメモリを持つものです。Javaでヒープオーバーフローが発生しているときに、何がメモリを使用しているかをどのように知ることができますか?

約1時間のデバッグ後にそれらを取得します。私は何らかのダンプや何かがあることを願っています。これは、プログラムの開始時にどのようなインスタンスが存在するかのリストを得るために使用できます。

ところで、これは怠惰な質問であれば申し訳ありません。私は本当にプロファイリングについて学ぶことにいつか入れました。

Grae

答えて

4

あなたは、ヒープダンプを生成するjmap -dumpを使用することができます。また、jhatやVisualVM(どちらもJDKに付属)など、さまざまなプログラムを使用してヒープダ​​ンプを分析できます。

Googleにこれまで以上にたくさんのことがあります。 :-)

+0

+1 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/ – stacker

+1

@stacker:+1に感謝します!私たちは実際に仕事でjhatをたくさん使っています。実際に作業時間の改善に取り組んでいます:https://github.com/on-site/fasthat(まだエキサイティングなものは実装していませんが、私はロードマップを持っています私たちのチームが本当に使い始めたいと思う機能のために) –

1

OutOfMemoryErrorのタイプが重要であることに注意してください。それには多くのバリエーションがあります。例外に付随するメッセージを読んでください。ヒープ関連のエラーを示す「Javaヒープスペース」でもかまいませんが、他のメモリー領域を参照する別のメッセージを持つこともできます(例えばthis postを参照)。

ヒープアロケーションの問題があると仮定すると、エラーが発生したときに完全なヒープダンプを取得するために、JVMフラグXX:+ HeapDumpOnOutOfMemoryErrorを使用できます。次に、ヒープダンプリーダーを使用して、結果を分析することができます(たとえば、VisualVMまたはjhat)。

他の応答として、コマンドラインツールのjmapも使用できます。私はjmap -histoを使い始めます。これは異なるクラスの単純なヒストグラムを作成します。不合理なインスタンス数のクラスがある場合は、メモリリークの疑いがあります。

+0

クラッシュが起きた後にjmapを使用できますか? –

+0

@Grae:Javaプロセスがダウンしている場合、できません。しかし、クラッシュする前にjmap(-histo)を何度か実行して、ヒープメモリーを取っているオブジェクトの種類を知ることができます。 –

+0

しかし、XX:+ HeapDumpOnOutOfMemoryErrorを使用している解決策は、クラッシュ後に機能しますか? –

1

JRockit VMをインストールしてから、JRockitコマンドセンターを使用してください。実際には本当に良いですし、メソッド名とCPU時間のリストと、これらのメソッドが消費しているCPU時間と、

0

VisualVMは無料で便利です。 JProfilerとYourKitはフリーではなく便利です。

1

Sun Java 6 JDKで最も有用なツールの1つは、以前に開始したプロセスにアタッチし、この問題を解決するために必要なメモリプロファイリングを行うことができる「jvisualvm」です。

(VisualVMを手動でダウンロードすることもできますが、おそらくJDKが起動して実行する最も簡単な方法です)。

初期使用上の注意については、http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/applications_local.htmlを参照してください。

+0

これは便利です:OOMEでヒープダンプを有効にします。アプリケーションがOutOfMemoryExceptionに遭遇したときにJava VisualVMが自動的にヒープ・ダンプを取るようにするには、これを選択します。 –

関連する問題