JVM ヒープ内のオブジェクトを分析する
デバッグ時に、 メモリ タブを使用してヒープ内のオブジェクトを確認できます。 IntelliJ IDEA を使用すると、個々のクラスインスタンスを追跡し、オブジェクトが生成または保持される条件を分析できます。
この情報は、メモリリークとその原因を検出できます。 一部のエラーは見落としやすいため、コード検査だけでは手がかりが得られない場合があります。 例: 内部クラスによって外部クラスがガベージコレクションの対象にならない場合があり、その結果 OutOfMemoryError が発生する可能性があります。 このような場合、 メモリ タブと 参照元オブジェクトの表示オプションを組み合わせると、リークを簡単に見つけることができます。
また、メモリ使用量を調べると、内部で何が起こっているかをよりよく理解し、不要なオブジェクトの作成を最小限に抑えることでプログラムを最適化できます。
メモリタブの表示 / 非表示
デバッグ ツールウィンドウの右上隅にある
をクリックし、 メモリ をクリックします。

メモリ タブには、次の情報が表示されます。
クラス: クラスの名前
Diff: 2 つの実行ポイント間のインスタンス数の違い
オブジェクトの数に関する情報を取得する
ブレークポイントで停止するか 、プログラムを 手動で中断します。
メモリ タブで、 クラスのロード をクリックします(パフォーマンスのために、 メモリ タブはオンデマンドでのみデータを収集します)。
ロードされたすべてのクラスのリストが「メモリ 」タブに表示されます。 対応するライブオブジェクトの数は、 数 列に表示されます。
クラスの並べ替えと検索
クラスをソートするには、対応するヘッダー(クラス、 数、 Diff )をクリックします。 すでに選択されている基準をクリックすると、順序が変わります(昇順 / 降順)。
クラスを検索するには、クラス名を入力し始めます。 入力するとフィルターが動的に適用されます。
2 つの実行ポイント間の差分を取得する
ある時点以降に作成されたオブジェクトの数を知ることが役立つ場合があります。 このために、情報を 2 回収集し、組み込みの Diff 機能を使用して比較できます。
開始点の インスタンスデータを収集します。
2 番目のポイントで インスタンスデータを収集します。 Diff 列では、インスタンスの数が変化したかどうかが表示されます。

インスタンスを表示
メモリ タブでクラスをダブルクリックします。
選択したクラスのすべてのライブインスタンスをリストするダイアログが開きます。 各オブジェクトのコンテンツを探索し、条件を使用してリストをフィルタリングできます。
例: すべての空の
Stringオブジェクトのリストを取得するには、 メモリ タブの String をダブルクリックし、 条件 フィールドにthis.isEmpty()を入力します。
保持サイズの計算
クラスインスタンスごとに、保持されるサイズを計算できます。 保持サイズは、オブジェクト自体が、それが参照するすべてのオブジェクトと一緒に占有し、他のオブジェクトによって参照されないメモリの量です。
これは、クラスまたはその特定のインスタンスのメモリフットプリントを見積もるときに役立ちます。 また、どのデータ構造を使用するかを決定するときにも役立ちます (たとえば、 ArrayList と LinkedList)。
アプリケーションを実行する前に、 で メモリエージェントを接続する オプションが有効になっていることを確認してください。
クラスのインスタンスを表示しているとき 、インスタンスを右クリックして 保持サイズの計算 をクリックします。
新規インスタンスの追跡
インスタンスの数を取得することに加えて、どの特定のインスタンスが作成されたか、発生したコールスタックのどこに記録することができます。
クラスを右クリックして、 新規インスタンスの追跡 を選択します。
メモリ タブには、この時点で作成された選択したクラスのインスタンスに関する情報が保存されます。 新しいインスタンスがある場合、その番号は Diff 列の括弧内に表示されます。
新しいインスタンスのリストを表示するには、 Diff 列の番号をクリックします。 開いたダイアログで、各オブジェクトの内容を調べて、対応するコンストラクターが呼び出されたスレッドのスタックトレースを確認できます。
ビューをカスタマイズする
メモリビュー設定 のオプションにより、 メモリ タブの動作をカスタマイズできます。
インスタンスを持たないクラスを非表示にするには、 インスタンスのみで表示 オプションを使用します。 デフォルトでは、インスタンス化されているかどうかに関係なく、 メモリ タブにはロードされたすべてのクラスが表示されます。
インスタンスの数が変更されたオブジェクトのみに関心がある場合は、 ゼロ以外の差分のみを表示 をクリックして選択します。 これにより、合計数が同じであるすべてのオブジェクトが削除されます。
新しいインスタンスを追跡していないクラスを非表示にするには、 追跡対象クラスのみを表示 オプションを使用します。
メモリ タブが選択されたクラスが非表示の場合でも、選択したクラスの新しいインスタンスを追跡できるようにするには、 隠しメモリビューによるトラッキングを使用可能にする オプションを使用します。 このオプションは、デバッグされるアプリケーションにオーバーヘッドを追加する場合があります。
プログラムが中断されるたびに(クラスのロード をクリックすることなく) メモリ タブでデータを収集する場合は、 デバッガーでロードされたクラスの更新を停止 オプションを使用します。 この機能はオーバーヘッドを追加する可能性があるため、ステップのパフォーマンスに影響します。