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

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

インスタンスを表示
メモリタブでクラスをダブルクリックします。
選択したクラスのすべてのライブインスタンスをリストするダイアログが開きます。各オブジェクトのコンテンツを探索し、条件を使用してリストをフィルタリングできます。
例: すべての空の
Stringオブジェクトのリストを取得するには、メモリタブの文字列をダブルクリックし、条件フィールドにthis.isEmpty()を入力します。
保持サイズの計算
クラスインスタンスごとに、保持されるサイズを計算できます。保持サイズは、オブジェクト自体が、それが参照するすべてのオブジェクトと一緒に占有し、他のオブジェクトによって参照されないメモリの量です。
これは、クラスまたはその特定のインスタンスのメモリフットプリントを見積もるときに役立ちます。また、どのデータ構造を使用するかを決定するときにも役立ちます (たとえば、ArrayList と LinkedList)。
アプリケーションを実行する前に、でメモリエージェントを接続するオプションが有効になっていることを確認してください。
クラスのインスタンスを表示するときは、インスタンスを右クリックして保持サイズの計算をクリックします。
新規インスタンスの追跡
インスタンスの数を取得することに加えて、どの特定のインスタンスが作成されたか、発生したコールスタックのどこに記録することができます。
クラスを右クリックして、新規インスタンスの追跡を選択します。
メモリタブには、この時点で作成された選択したクラスのインスタンスに関する情報が保存されます。新しいインスタンスがある場合、その番号は差分列の括弧内に表示されます。
新しいインスタンスのリストを表示するには、差分列の番号をクリックします。開いたダイアログで、各オブジェクトの内容を調べて、対応するコンストラクターが呼び出されたスレッドのスタックトレースを確認できます。
ビューをカスタマイズする
メモリビュー設定 のオプションにより、メモリタブの動作をカスタマイズできます。
インスタンスを持たないクラスを非表示にするには、インスタンスのみで表示オプションを使用します。デフォルトでは、インスタンス化されているかどうかに関係なく、メモリタブにはロードされたすべてのクラスが表示されます。
インスタンスの数が変更されたオブジェクトのみに関心がある場合は、ゼロ以外の差分のみを表示をクリックして選択します。これにより、合計数が同じであるすべてのオブジェクトが削除されます。
新しいインスタンスを追跡していないクラスを非表示にするには、追跡対象クラスのみを表示オプションを使用します。
メモリタブが選択されたクラスが非表示の場合でも、選択したクラスの新しいインスタンスを追跡できるようにするには、隠しメモリビューによるトラッキングを使用可能にするオプションを使用します。このオプションは、デバッグされるアプリケーションにオーバーヘッドを追加する場合があります。
プログラムが中断されるたびに(クラスのロードをクリックすることなく)メモリタブでデータを収集する場合は、デバッガーでロードされたクラスの更新を停止オプションを使用します。この機能はオーバーヘッドを追加する可能性があるため、ステップのパフォーマンスに影響します。
関連ページ:
中断されたプログラムを調べる
デバッガーセッションが開始されると、デバッグツールウィンドウが表示され、次のいずれかが発生するまでプログラムが正常に実行されます。ブレークポイントがヒットしました、プログラムを手動で一時停止する、その後、プログラムは中断され、現在の状態を調べたり、実行を制御したり、実行時にさまざまなシナリオをテストしたりできます。フレームを調べる:プログラムの状態はフレームで表されます。プログラムが一時停止すると、現在のフレームスタックがデバッグツールウィンドウのフレームタブに表示されます。フレームはアクティ
ブレークポイント
ブレークポイントは、特定のポイントでプログラムの実行を一時停止する特別なマーカーです。これにより、プログラムの状態と動作を調べることができます。ブレークポイントは、たとえば、特定のコード行に到達したときにプログラムを一時停止するなどの単純なものから、追加の条件をチェックしたり、ログに書き込んだりするなどのより複雑なロジックを含むものまであります。ブレークポイントは、一度設定すると、一時的なブレークポイントを除き、明示的に削除するまでプロジェクト内に残ります。ブレークポイントの種類:Intell
デバッガーセッションを開始する
デバッガーセッションの開始は、プログラムを通常モードで実行するのと非常によく似ています。デバッガーはバックグラウンドで接続されているため、デバッガーセッションを開始するために特別な設定を行う必要はありません。IntelliJ IDEA からプログラムを実行できる場合は、同じ構成を使用してプログラムをデバッグすることもできます。プログラムをデバッグするたびに、デバッガーセッションは実行 / デバッグ構成に基づきます。これにより、アプリケーションを起動するためのパラメーターとアクションを構成できます...
プログラムのステップスルー
ステップは、プログラムの段階的な実行を制御するプロセスです。デバッグセッションを開始し、プログラムを一時停止すると、IntelliJ IDEA は一連のステップアクションを提供します。ステップアクションの選択は、次の行に直接移動する必要があるか、中間のメソッド呼び出しもインスペクションする必要があるかなど、戦略によって異なります。ステップボタンは、デバッグツールウィンドウのツールバーにあります。ステップオーバー:現在のコード行をステップオーバーし、ハイライトされた行にメソッド呼び出しが含まれて...
デバッガーのオーバーヘッドを監視する
式を評価するか、コードをステップオーバーするたびに、IntelliJ IDEA はデバッグされるアプリケーションと同じリソースを使用します。これにより、特定の場合に全体的なパフォーマンスに劇的な影響を与える可能性があります。例: 条件が重いブレークポイントは、コード行の補完に必要な時間を大幅に増やす可能性があります。デバッグされたアプリケーションのパフォーマンスが十分でない場合は、オーバーヘッドタブを使用して、どのデバッガー機能がほとんどのリソースを消費しているかを調べます。オーバーヘッド情報の...
Java Stream 操作を分析する
Java ストリームはデバッグが難しい場合があります。これは、Java ストリームがバックグラウンドで処理ロジックを処理するため、特定の値がどのように導出されるかのトレースが複雑になる可能性があるためです。Java ストリームのデバッグを支援するために、IntelliJ IDEA は Java ストリーム内で何が起こっているかを視覚化します。関数スタイルで書かれた簡単なプログラムを取り上げて、関数がどのように機能するかを示しましょう。import java.util.stream.IntStre...