Java でのメモリ リークの概要

Y2J
リリース: 2017-04-21 16:33:46
オリジナル
1749 人が閲覧しました

Java 言語の主な利点は、メモリ管理メカニズムです。オブジェクトを作成するだけで、Java のガベージ コレクターがメモリの割り当てと再利用を支援します。ただし、Java アプリケーションでは依然としてメモリ リークが発生するため、実際の状況はそれほど単純ではありません。

以下では、メモリリークとは何か、なぜメモリリークが起こるのか、そしてメモリリークの発生を防ぐ方法について説明します。

1. メモリリークとは何ですか?

メモリリークの定義: オブジェクトはアプリケーションによって使用されなくなりましたが、オブジェクトはまだ参照されているため、ガベージコレクターは削除できません。

この定義を理解するには、まずメモリ内のオブジェクトの状態を理解する必要があります。以下の図は、役に立たないオブジェクトとは何か、参照されていないオブジェクトとは何かを説明しています。

未使用と未参照

上の図からわかるように、参照されているオブジェクトと参照されていないオブジェクトがあります。参照されていないオブジェクトはガベージ コレクターによって収集されますが、参照されたオブジェクトは収集されません。参照されていないオブジェクトとは、当然のことながら、もう参照しているオブジェクトがないため、使用されなくなったオブジェクトです。ただし、役に立たないオブジェクトがすべて参照されていないオブジェクトであるわけではありません。そのうちの一部を引用します。この状況がメモリ リークの原因となります。

2. メモリリークはなぜ起こるのでしょうか?

まず、メモリ リークが発生する理由を確認するために次の例を見てみましょう。次の例では、オブジェクト A がオブジェクト B を参照します。オブジェクト A のライフ サイクル (t1 ~ t4) は、オブジェクト B のライフ サイクル (t2 ~ t3) よりもはるかに長くなります。 B オブジェクトがアプリケーションによって使用されていない場合でも、A オブジェクトは B オブジェクトを参照します。このように、ガベージ コレクターはメモリから B オブジェクトを削除できず、メモリの問題が発生します。これは、A がそのようなオブジェクトをさらに参照すると、参照されていないオブジェクトがさらに存在し、メモリ領域を消費するためです。 オブジェクト B には他の多くのオブジェクトも保持されている可能性があり、これらのオブジェクトもガベージ コレクターによってリサイクルされません。これらすべての未使用のオブジェクトは、以前に割り当てられたメモリ領域を消費し続けます。

Object-Life-Time

3. メモリリークの発生を防ぐには?

メモリリークの発生を防ぐために役立つ、使いやすい提案をいくつか紹介します。

    HashMap や ArrayList などの一部のコレクション オブジェクトは、メモリ リークを引き起こすことが多いため、特に注意してください。静的と宣言された場合、その存続期間はアプリケーションと同じ長さになります。
  • イベント

    リッスンとコールバック関数に特に注意してください。リスナーは使用中に登録されますが、使用されなくなっても登録は解除されません。

  • 「クラスが独自のメモリを管理する場合、開発者はメモリ リークに注意する必要があります。」 通常、一部のメンバー
  • 変数

    は他のオブジェクトを参照するため、初期化中に空白のままにしておく必要があります。

  • 4. ちょっとした質問: JDK6 の substirng() メソッドはなぜメモリ リークを起こしやすいのでしょうか?

上記の質問に答えるには、JDK 6 と 7 の Substring() を見てみるとよいでしょう。

以上がJava でのメモリ リークの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート