Java のガベージ コレクションとオブジェクトのライフ サイクルの詳細な説明
Java のガベージ コレクションとオブジェクトのライフ サイクル
1. ガベージ コレクション
ガベージ コレクションは、Java プログラミングにおけるメモリ管理の中心的な概念であり、JVM のメモリ管理メカニズムと呼ばれます。ゴミのリサイクルの仕組み。
オブジェクトは作成された後、JVM のヒープ メモリに配置され、このオブジェクトが参照されない場合は、JVM によってヒープ メモリ内でリサイクルされます。作成されたオブジェクトは再作成できず、プログラム ステートメントを通じてオブジェクトを解放する方法もありません。つまり、JVM ランタイム空間のルート コレクションを介してオブジェクトに到達できない (見つからない) 場合、そのオブジェクトはガベージ オブジェクトと呼ばれます。ルート コレクションは、クラス内の静的参照フィールドとローカル参照フィールドで構成されます。 JVM は、ルート コレクションを通じてオブジェクトにインデックスを付けます。
Java アプリケーションを開発する場合、JVM によって管理される 2 種類のメモリ (ヒープ メモリとスタック メモリ) がよく使用されます。簡単に言えば、ヒープ メモリは主に、実行時にプログラムによって作成またはインスタンス化されたオブジェクトと変数を格納するために使用されます。たとえば、new キーワードを通じて作成されたオブジェクトなどです。スタック メモリは、プログラム コード内で静的または非静的として宣言されたメソッドを格納するために使用されます。
(1) ヒープメモリ
ヒープメモリは、JVM の起動時に作成されます。ヒープメモリに格納されたオブジェクトは、JVM によって自動的にリサイクルできますが、他の外部手段によってリサイクルすることはできません。つまり、開発者は関連するコードを追加できません。ヒープメモリ内のオブジェクトを再利用することを意味します。ヒープ メモリは通常、新しいオブジェクト領域と古いオブジェクト領域の 2 つの領域に分割されます。
新しいオブジェクトエリア: Eden エリア、From エリア、To エリアの 3 つの小さなエリアに細分化できます。 Eden 領域は、新しく作成されたオブジェクトを保存するために使用されます。Eden 領域内のオブジェクトがいっぱいになると、新しいオブジェクトが作成され、メインにアクセスできるようになります。性別テストのタスクは、ルート コレクションから到達できないオブジェクトを検出することです。これらのオブジェクトは JVM によってリサイクルされ、すべてのアクティブなオブジェクトが Eden 領域から To 領域にコピーされます。このとき、一部のオブジェクトには状態交換が行われます。一部のオブジェクトは To 領域から From 領域に転送されます。このとき、From 領域にはオブジェクトが存在します。上記のオブジェクト移行のプロセス全体は、JVM によって制御されます。
古いオブジェクト領域: 古いオブジェクト領域のオブジェクトは依然として長いライフサイクルを持ちます。ほとんどの JVM システムのガベージ オブジェクトは、一定期間が経過すると、古いオブジェクト領域に転送されます。ゴミオブジェクト。現時点では、それらはすべて適切にマークされており、JVM システムはこれらのガベージ オブジェクトを自動的にリサイクルします。これは、JVM がガベージ コレクション作業を完了するために限られたシステム リソースを使用するため、システムにガベージ コレクションを強制的に実行させないことをお勧めします。ユーザー側からの要求に迅速に応答できないと、システム全体のパフォーマンスに影響します。
(2) スタックメモリ
ヒープメモリは主に、実行時にプログラムによって作成またはインスタンス化されたオブジェクトと変数を保存するために使用されます。たとえば、new キーワードを通じて作成されたオブジェクトなどです。スタック メモリは、プログラム コード内で静的または非静的として宣言されたメソッドを格納するために使用されます。
2. JVM におけるオブジェクトのライフ サイクル
JVM ランタイム空間では、オブジェクトのライフ サイクル全体が次の 7 つの段階に大別されます。
到達不能フェーズ;
収集可能フェーズ;
解放フェーズ
上記の 7 つのフェーズは、JVM 内のオブジェクトの完全なライフサイクルを構成します。
(1) 作成フェーズ
オブジェクト作成フェーズでは、システムは主に次の手順でオブジェクトの作成プロセスを完了します。 , サブクラスのコンストラクター呼び出し。オブジェクトを作成するときは、いくつかの重要なアプリケーション ルールに注意してください。
& lt; オブジェクトが多くのメモリ領域を占有する場合でも、サイクル本体内でオブジェクトを作成しないでください。 2 & lt; 2 & gt; 対象物を期限内にゴミリサイクル基準に適合させるよう努めます。たとえば、myObject = null です。 3 <3> 深い継承レベルを採用しないでください。<4> ローカル変数へのアクセスは、クラス内の変数へのアクセスよりも優れています。
(2) 申請段階
オブジェクト参照フェーズでは、オブジェクトには次の特性があります:
システムはオブジェクトに対する少なくとも 1 つの強い参照 (強参照) を維持します。
参照 (ソフト参照、弱参照、またはファントム参照を明示的に適用しない限り)
強参照: ルート参照コレクションから走査する JVM メモリ マネージャーを指します。ヒープ内のオブジェクトへのすべてのパスです。オブジェクトへのパスに参照オブジェクトが含まれていない場合、そのオブジェクトへの参照は強参照と呼ばれます。
ソフトリファレンス: ソフトリファレンスの主な特徴は、強参照機能です。このタイプのメモリはメモリが不足している場合にのみ再利用されるため、メモリが十分にある場合は通常は再利用されません。さらに、これらの参照オブジェクトは、Java が OutOfMemory 例外をスローする前に null に設定されることが保証されます。これを使用して、一般的に使用されるリソースをキャッシュし、OutOfMemory を引き起こすことなくメモリを最大限に使用できるようにする Cache 関数を実装できます。
以下はソフトリファレンスの実装コードです:
import java.lang.ref.SoftReference; ... A a = new A(); ... // 使用a ... // 使用完了a, 将它设置为soft引用类型,并且释放强引用 SoftReference sr = new SoftReference(a); a = null; ... // 下次使用时 if (sr != null) { a = sr.get(); } else { // GC由于低内存,已释放a,因此需要重新装载 a = new A(); sr = new SoftReference(a); }
ソフトリファレンステクノロジの導入により、Java アプリケーションはメモリをより適切に管理し、システムを安定させ、システムメモリのオーバーフローを防ぎ、システムクラッシュを回避することができます。したがって、大量のメモリを占有し、ライフサイクルが長いものの、頻繁には使用されないオブジェクトを扱う場合には、このテクノロジを可能な限り適用する必要があります。システムの安定性を向上させます。
弱参照: 弱アプリケーション オブジェクトとソフト参照オブジェクトの最大の違いは、GC がガベージ コレクションを実行するときに、ソフト アプリケーション オブジェクトをリサイクルするかどうかをチェックするアルゴリズムを使用する必要があるのに対し、弱参照の場合、GC は常にオブジェクトをリサイクルすることです。弱い参照オブジェクトは、GC によって簡単かつ迅速にリサイクルされます。弱い参照オブジェクトは、Map 構造でよく使用されます。
import java.lang.ref.WeakReference; ... A a = new A(); ... // 使用a ... // 使用完了a, 将它设置为Weak引用类型,并且释放强引用 WeakReference wr = new WeakReference(a); a = null; ... // 下次使用时 if (wr != null) { a = wr.get(); } else { a = new A(); wr = new WeakReference(a); }
ファントム リファレンス: ファントム リファレンスの用途は少なく、主にファイナライズ機能の使用を補助するために使用されます。
ファントム参照オブジェクトは、ファイナライズ関数の実行を終了し、到達不可能なオブジェクトであるが、まだ GC によってリサイクルされていない一部のオブジェクトを参照します。この種のオブジェクトは、後のリサイクル作業でのファイナライズに役立ちます。Reference の clear() メソッドをオーバーライドすることで、リソース リサイクル メカニズムの柔軟性が強化されました。
弱参照と仮想参照は、実際のプログラミングではほとんど使用されません。ソフト参照は、JVM によるガベージ メモリの回復を高速化し、システムの動作安全性を維持し、メモリ オーバーフローを防ぐことができるため、ソフト参照がより頻繁に使用されます ( OutOfMemory) などの問題が発生します。
(3) 不可視の段階
オブジェクトが不可視の段階にあるとは、他の領域のコードでそのオブジェクトを参照できなくなり、その強参照が消滅したことを意味します。たとえば、ローカル変数がその値を超えています。視認性
の範囲。
try { Object localObj = new Object(); localObj.doSomething(); } catch (Exception e) { e.printStackTrace(); } if (true) { // 此区域中localObj 对象已经不可视了, 编译器会报错。 localObj.doSomething(); }
(4) 到達不能ステージ
到達不能ステージのオブジェクトは、仮想マシンのオブジェクト参照ルート コレクションで直接または間接の強参照を見つけることができなくなります。これらのオブジェクトは、通常、すべてのスレッド スタックで一時変数になります。ロードされたすべての静的変数またはネイティブ コード インターフェイスへの参照。
(5) 収集可能段階、最終段階、解放段階
オブジェクトが収集可能段階、最終段階、解放段階にあるとき、そのオブジェクトには次の 3 つの状況があります。オブジェクト オブジェクトには到達できなくなりました。
ファイナライズメソッドが実行されました。
<3> オブジェクト空間が再利用されました。
読んでいただきありがとうございます、お役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!
Java のガベージ コレクションとオブジェクトのライフサイクルの詳細な説明に関する記事については、PHP 中国語 Web サイトに注目してください。