Java でメモリ リークを見つける

Shubham Vora 2023年6月20日
  1. Java でのメモリ リークの原因
  2. Java でメモリ リークを見つける
Java でメモリ リークを見つける

この記事では、Java メモリ リークを見つける方法を説明します。

未使用のアイテムが余分なメモリ スペースを占めることは、メモリ リークと呼ばれます。 メモリ リークは、メモリ リソースを詰まらせ、時間の経過とともにシステム パフォーマンスを低下させるため、問題となります。

この問題が解決されない場合、プログラムは最終的にリソースを使い果たし、致命的な java.lang.OutOfMemoryError でクラッシュします。

その主な利点の 1つは、Java の組み込み ガベージ コレクター によって提供される自動メモリ管理です。 ガベージ コレクターは、メモリの割り当てと解放を暗黙的に処理するため、メモリ リークの問題の大部分を解決する可能性があります。

ガベージ コレクターは大量のメモリを正常に管理しますが、メモリ リークに対するフェールセーフ防御を提供することはできません。 ガベージ コレクタはインテリジェントですが、完全ではありません。

良心的な開発者によって作成されたアプリでさえ、メモリ リークの影響を受けやすくなっています。

Java でのメモリ リークの原因

Java メモリ リークは、不要になったオブジェクト参照をアプリケーションが誤って保持している場合によく発生します。 Java ガベージ コレクション プロセスは、意図しないオブジェクト参照が原因で、これらのオブジェクトが使用するメモリを解放できません。

メモリ リークの最も一般的な原因の一部を次に示します。

  1. 無制限のキャッシュ。
  2. 多数のセッション オブジェクト。
  3. 削除せずに Collection オブジェクトに挿入します。
  4. 未使用のリスナー メソッド。
  5. オペレーティング システムでの過剰なページ切り替え。
  6. 適切に記述されていないカスタム データ構造。

Java でメモリ リークを見つける

メモリ リークを見つける絶対的な方法はないため、メモリ リークを見つけるのは難しい場合があります。 Java でメモリ リークを見つけるには、いくつかの効率的な方法があります。

メモリ プロファイラーの使用

Java プロファイリングを使用すると、メソッドの実行、オブジェクトの生成、スレッドの実行、ゴミの収集など、多くの JVM 特性を追跡できます。 メモリ プロファイラーは、使用されているメモリの量を追跡し、アプリケーションでメモリ リークを見つけるのに役立ちます。

プロファイラーは、各関数がメモリと CPU をどれだけ消費するかなど、アプリケーション内でリソースがどのように割り当てられているかを調べるのにも役立ちます。 メモリ プロファイラーを使用して、問題を特定して見つけることができます。

Java プロファイリング ツールを使用すると、次のメトリックを検出できます。

  1. メソッド呼び出しの詳細
  2. メモリの使用
  3. メソッドの CPU 時間
  4. 作成されたオブジェクト
  5. ガベージ コレクターによって削除されたオブジェクト。

ヒープ ダンプの使用

これは、Java でメモリ リークを見つけるためのもう 1つの手法です。 ヒープ ダンプは、特定の時点で Java アプリケーションによって使用されるヒープ メモリのスナップショットを提供します。

開いているオブジェクト インスタンスの数とそれらのメモリ使用量が明らかになります。 ヒープ ダンプは、アプリケーションで生成されたオブジェクトの数と、それらのいずれかがメモリ リークを引き起こしている可能性があるかどうかを判断するのに役立ちます。

詳細なガベージ コレクション

Verbose ガベージ コレクションを有効にすると、Java ガベージ コレクションの詳細なトレースを取得できます。 次の引数を JVM 構成に追加して、詳細なガベージ コレクションを有効にします。

-verbose:gc

デフォルトのエラー レポートとして表示される概要を使用して、メモリの処理方法を確認し、メモリ リークを特定できます。

Eclipse メモリ リーク警告の使用

Eclipse のメモリ リーク警告を使用することは、メモリ リークを発見するもう 1つの方法です。 Eclipse は、参照が終了したときにアラートを出すことができますが、コードがJDK 1.5以上に準拠している場合、オブジェクトは続行され、閉じられません。

プロジェクト設定でリーク検出が許可されていることを確認してください。 Eclipse の利用は完全なソリューションではない可能性があることに注意してください。

特に、コードがJDK 1.5(またはそれ以降) と互換性がない場合、Eclipse はすべてのリークをキャッチできず、一部のファイル クロージャーを検出できない可能性があります。

他ツール

  1. NetBeans Profiler – メモリ、スレッド、および CPU リソースを監視でき、Java SE、Java FX、EJB、モバイル アプリケーション、および Web アプリケーションをサポートします。

  2. VisualVM – NetBeans プラットフォーム上に構築された VisualVM は、さまざまなプラグインを使用してリモートおよびローカル プログラムを監視するためのアプリケーションに関する広範な情報を提供する、簡単に拡張可能なツールです。 このプログラムを使用すると、ガベージ コレクターを手動で実行し、メモリ プロファイリングを取得できます。

  3. JProfiler – スレッド、メモリ、および CPU をプロファイリングするためのツールであり、メモリ リークやその他のパフォーマンスの問題を調べることもできます。

  4. GCeasyGCeasy は、ガベージ コレクション ログを分析し、ガベージ コレクション ログを確認しながらメモリ リークの問題を見つけるための簡単な方法を提供するツールです。 GCeasy の使用は、コンピューターのインストールを必要とせずにオンラインでアクセスできるという事実によってさらに促進されます。

  5. GC Viewer – JVM データを使用して迅速かつ簡単に情報を視覚化できるオープンソース プログラムです。 GC Viewer は、累積的な一時停止、最も長い一時停止、スループットなどのガベージ コレクションのパフォーマンス情報を表示します。

    このプログラムでは、ガベージ コレクションを開始できるだけでなく、初期ヒープ サイズを指定することもできます。

  6. Patty in action – これは、自分自身をプロファイリングし、的を絞った詳細なプロファイリングを取得するために使用できる、もう 1つのオープンソース プログラムです。 このツールは、ヒープの調査に使用できます。

  7. JRockitJRockit は、遅延の予測、ガベージ コレクションの表示、およびメモリ関連の問題の分析を行うことができる、Java SE アプリケーション用の独自の Oracle ソリューションです。

このチュートリアルでは、Java でのメモリ リーク、そのさまざまな原因、およびそれらを見つける方法について学びました。 このチュートリアルでは、さまざまなツールとテクニックについて説明します。

ユーザーは、手法とツールに従ってメモリ リークを減らし、アプリケーションのパフォーマンスを向上させることができます。

著者: Shubham Vora
Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub