2

私は Java の初心者であり、NetBeans でこのメモリ プロファイル セッションを分析する方法と、それを監視してメモリ リークの検索を支援する方法を知りたいと考えています。

「ライブバイト」とは?すべてのライブ バイトを合計すると、Java アプリケーション システム メモリによって使用されるごく一部しか得られないことがわかります。各オブジェクト タイプの割り当てられたバイト数に関する情報がないのはなぜですか? 「割り当てられたオブジェクト」の値が増え続けているのは、メモリ リークの兆候ですか?

これは、多数の同時スレッドと http 接続を使用するアプリケーションです。スレッドを確認しましたが、問題なく動作しています。つまり、同時に 20 を超えるスレッドはありません。http 接続には JBOSS Netty を使用し、HTML の解析には jSoup を使用しました。

netbeans プロファイラー

このメモリ リークは、割り当てられた ParseError オブジェクトが多すぎることが原因ですか? または、バイト作成スタック トレースでメモリ リークの理由を検索する必要がありますか?

その他のリソース:

netbeans プロファイラー

netbeans プロファイラー

編集:

プロジェクトに HTML Cleaner を追加しました。これにより、パーサー エラーが表示されなくなりました。メモリ リークの増加が約 3 ~ 4 倍遅くなりました。メモリ使用量が 800MB に達した後、アプリケーションがクラッシュし、NetBeans でヒープを監視できました。結果:

ヒープ

注: アプリで LinkedHashMap を作成していないため、他のライブラリで作成する必要があります。TagNode は、「HTML Cleaner」によるクリーニング後にクリーニングされた html を保持するオブジェクトです。私のアプリには TagNode オブジェクトが 1 つしかなく、これは netty http 応答ハンドラー (messageReceived によって呼び出される) のローカル変数です。

4

2 に答える 2

2

私は常に、Netbeansの組み込み診断機能​​よりもEclipseのMATツールを好みました。MATは、Netbeansよりも大きなヒープダンプでも機能します。

最も簡単なのは、jvmにOOMでヒープダンプを吐き出させ、それをMATにフィードし、リークの疑いのあるリストに基づいて、メモリリークの考えられる原因にトレースバックすることです。

-XX:+HeapDumpOnOutOfMemoryError

必要なJVMオプションです。もう1つのアプローチは、アプリケーションOOMの前に定期的にいくつかのヒープダンプを生成し、MATでそれらを比較することです。これには、ダンプを比較する機能があります。ダンプを生成する方法については、こちらをご覧ください。ヒープ要素の内容を調べて、それらがどこから来ているのかを把握する必要がある場合があります。

簡単なことではなく、ヒープダンプで犯人にズームインする方法を学ぶのに少し時間がかかりますが、それは非常に便利なスキルです。

于 2011-08-12T23:08:08.037 に答える
0

char[] オブジェクトがたくさんあるようです。私のメモリリークのほとんどは、ループが本来よりも多くの回数反復されている、誤って構築されたループに起因することがわかりました。これにより、大量のオブジェクトが作成され、メモリ リークが発生します。

ライブ バイトは、ライブ オブジェクトが占める合計バイト数です。

多くのchar[]ライブ バイトが使用されています。おそらくメモリリークが発生している理由なので、これについては疑わしいでしょう。

ブレークポイントを作成し、実行をステップ実行して、メモリ リークが発生した行を正確に確認することをお勧めします。

NetBeans IDE での Java アプリケーションのプロファイリングの概要を読むのに適した場所です。NetBeans でデバッグする方法を教えてください。

お役に立てれば。

于 2011-08-12T21:16:37.483 に答える