私は Java アプリケーションを持っていますが、残念ながら、しばらくすると大量のメモリを消費し始めます。複雑なことに、これは Java アプリケーションだけでなく、JavaFX 2 アプリケーションでもあります。
基盤となる JavaFX 呼び出しやネイティブ ライブラリでさえ、メモリ リークが発生していると思われます。
理想的な解決策は、ある時点ですべての Java オブジェクトのダンプを (メモリ使用量とともに) 取得し、そのダンプを分析することです。これを達成する方法はありますか?
jmap -heap:format=b <process-id>
いくつかのツールにロードできるヒープのバイナリ ダンプを作成するために使用します。私のお気に入りは「Eclipse メモリ アナライザー」です。
ヒープ ダンプを取得する方法はたくさんあります。jmap のような単純なツールから始まり、JVisualVM のようなより洗練されたもの、さらには JProfiler のような商用ツールまであります。ただし、これらのダンプを正しく解釈するのは難しい場合があるため、探しているものを正確に投稿することをお勧めします。メモリ リークを探していますか、それともアプリケーションの全体的な感触をつかむことに興味がありますか?
jvisualvmを使用できます。ライブメモリを表示してダンプを取得するプラグインがあります。
「現時点での JVM 状態」を取得する方法を調査しているときに、この記事を再発見しました。プルしたヒープjmap
のサイズは、MBean が報告したサイズの約半分でした。完全を期すために追加します。
su $JVM_OWNER -c "gcore -o /tmp/jvm.core $YOUR_JVM_PID"
su $JVM_OWNER -c "jmap -dump:format=b,file=jvm.hprof /usr/bin/java /tmp/jvm.core"
gdb のインストール ( の場合gcore
) と JDK のインストール (jmap の場合) が必要です。/usr/bin/java
また、プロセスに使用される JVM のパスを調整する必要がある場合があることにも注意してください。