2011-08-12 12 views
1

私はJavaの初心者で、NetBeansでこのメモリプロファイルセッションを分析する方法と、メモリリークの検索を支援する方法を知りたいと思っていますか?JavaでこのNetBeansメモリプロファイルセッションを理解する方法(可視メモリリーク)?

"ライブバイト"とはどういう意味ですか?ライブバイトをすべて集計すると、Javaアプリケーションシステムのメモリで使用されるわずかな部分しか得られないことがわかります。 各オブジェクトタイプの割り当てバイトに関する情報がないのはなぜですか? メモリリークの "割り当てられたオブジェクト"記号の値が連続的に増加していますか?

これは、多数の同時スレッドとhttp接続を持つアプリケーションです。 私はスレッドをチェックしていて、うまく動いています - つまり、同時に20スレッド以下です。 私は、http接続にJBOSS Nettyを使用し、HTMLを解析するためにjSoupを使用しました。

netbeans profiler

あまりにも多く割り当てられたParseErrorのオブジェクトによって引き起こされ、このメモリリークですか?または私はバイト作成スタックトレースでメモリリークのために護衛する必要がありますか?

追加リソース:

netbeans profiler

netbeans profiler

EDIT:

私は私のプロジェクトのHTMLクリーナーに追加しました。これは、私はもうパーサーエラーが表示されない原因です。メモリリークの成長は現在、約3〜4倍遅くなります。 800MBのメモリ使用量に達した後、アプリがクラッシュし、NetBeansでヒープを見ることができました。結果:

heap

注:私は私のアプリでどんなのLinkedHashMapを作成していなかったので、それは他のライブラリで作成する必要があります。 TagNodeは、 'HTMLクリーナー'のクリーニング後にクリーンなHTMLを保持するオブジェクトです。私はアプリケーション内に1つのTagNodeオブジェクトしか持っておらず、netty http応答ハンドラ(messageReceivedによって呼び出される)のローカル変数です。

答えて

2

私はいつもNetbeansの組み込み診断機能​​にはEclipse's MAT toolを優先しています。 MATは、Netbeansよりも大きなヒープダンプでも動作します。

最も簡単なのは、jvmがOOM上でヒープダンプを吐き出し、MATにフィードし、リーク疑惑リストのトレースに基づいてメモリリークの原因を調べることです。

-XX:+HeapDumpOnOutOfMemoryError 

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

ヒープダンプの原因を拡大する方法を学ぶのに時間がかかりますが、非常に便利なスキルです。

+0

+1ヒープダンプ解析(通常はNetbeansを使用)のためにEclipseに切り替えた後に、微妙なメモリリークを追跡しました。 –

0

あなたはたくさんのchar []オブジェクトを持っているようです。私は、私のメモリリークの大部分が誤って構築されたループから来ていることがわかりました。膨大な量のオブジェクトが作成され、メモリリークが発生します。

ライブバイトは、ライブオブジェクトが使用する合計バイト数に過ぎません。

使用中のライブバイトが多くあります(char[])。私はおそらくメモリリークが発生している理由としてこれについて疑いがあるでしょう。

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

読みやすい場所はIntroduction to Profiling Java Applications in NetBeans IDE.です。NetBeansでデバッグする方法を教えてください。

これが役に立ちます。

関連する問題