メモリスナップショットを分析する
このトピックでは、スナップショットを IntelliJ IDEA で取得した後、または 外部スナップショットを開いた後にスナップショットを分析する方法について説明します。
IntelliJ IDEA は、 プロファイラー ツールウィンドウを開き、メモリスナップショットの内訳を表示します。

スナップショットの左側には、アプリケーション内のクラスのリスト、各クラスに含まれるライブインスタンスの数、すべてのインスタンスの浅いサイズと保持されたサイズが表示されます。
浅いサイズ: オブジェクト自体を格納するために割り当てられたメモリの量。 このオブジェクトによって参照されるオブジェクトのサイズは含まれません。
保持サイズ: オブジェクトの浅いサイズと保持されているオブジェクトの浅いサイズの合計(オブジェクトはこのオブジェクトからのみ参照されます)。 つまり、保持されるサイズは、このオブジェクトをガベージコレクションすることで再利用できるメモリの量です。

スナップショットの右側にはいくつかのタブがあり、次の情報を計算して表示できます。
最大オブジェクト タブには、保持されているサイズ順にメモリを最も多く保持しているオブジェクトが一覧表示されます。 これらのオブジェクトはドミネーター ツリーのルートとして表示されます。 このタブでは、個々のオブジェクトが原因のメモリリークを特定できます。

GC ルート タブでは、各クラスの対応する ガーベジコレクタールートオブジェクトが一覧表示されます。 この情報は、スナップショット取得時にガーベジコレクションされなかったすべてのオブジェクトの概要を示します。 例えば、どのクラスローダーがアプリサーバーで最も多くのメモリを消費しているかを確認する際などに便利です。

マージパス タブはオブジェクトをクラスごとにグループ化し、保持しているドミネーターオブジェクトまでのパスを表示します。 この情報により、特定のクラスのインスタンスがなぜ保持されているのかを理解できます。

要約 タブには、全体サイズやインスタンス数、スレッドのスタックトレースなどの一般情報が表示されます。

パッケージ タブでは、すべてのオブジェクトがパッケージごとに分類されて表示されます。 これにより、どのサブシステムが最も多くのメモリを消費しているかや、メモリリークの可能性がある箇所をすばやく特定できます。

オブジェクトビュー
オブジェクト ビューには、保持されているサイズ順にクラスインスタンスが表示されます。
クラス タブの項目をダブルクリックすると、ビューを開くことができます。 アイテムを右クリックして 新規タブで開く を選択するか、 Enter を押すこともできます。

クラスインスタンスごとに、次の情報を計算および表示できるいくつかのタブがあります。
最短パス: ガベージコレクターのルートへの最短の参照チェーン。
着信参照: 他のインスタンスからの受信参照。
ドミネーター: どのオブジェクトが特定のインスタンスを保持しているかを確認できます(ガベージコレクションされないようにします)。 すべてのインスタンスにはドミネーターが 1 つしかないか、まったくありません。
保持オブジェクト: 保持されたオブジェクトが特定のオブジェクトの保持されたサイズにどのようにコントリビュートするかを示すサンバーストダイアグラム。
ドミネーターツリー: 保持されたオブジェクトのツリー。 特定のオブジェクトへの参照を削除することで、どのくらいのメモリを再利用できるか、どの特定のオブジェクトが一緒にガベージコレクションされるかを確認できます。
生産性のヒント
- スピード検索を使用する。
クラス タブと オブジェクト ビューでは、スピード検索を使用できます。
クラス名前の入力を開始します。 入力すると、入力した文字を示す 検索 フィールドがツールウィンドウ上に表示され、選択範囲が指定した名前に一致する最初の項目に移動します。 詳細については、 ツールウィンドウのスピード検索 を参照してください。
- ソースに移動
プロファイラー ツールウィンドウからソースコードの対応する行にすばやく移動できます。項目を右クリックして ソースに移動 を選択するか、 F4 を押します。