この記事では、Java 学習のための Jvm ガベージ コレクター (基本) を紹介します。困っている友人は参考にしていただければ幸いです。
この記事「Jvm ランタイム データ領域」では、プログラム カウンター、仮想マシン スタック、ローカル メソッド スタックなど、Java メモリ ランタイム領域のさまざまな部分を紹介します。スレッドが存続する限り、エリアも存続します。メモリの割り当てと割り当て解除は決定的です。メモリはスレッドの終了時に自然にリサイクルされるため、ガベージ コレクションを考慮する必要はありません。 Java ヒープとメソッド領域は異なり、各スレッドによって共有され、メモリの割り当てとリサイクルが動的に行われます。したがって、ガベージ コレクターはメモリのこの部分に焦点を当てます。
次に、Jvm がメモリのこの部分をどのように再利用するかについて説明します。ガベージ コレクターがリサイクルする前に最初に行うことは、どのオブジェクトがまだ生きていてどのオブジェクトが死んでいるかを判断することです。 2 つの基本的なリサイクル アルゴリズムを以下に紹介します。
オブジェクトに参照カウンタを追加します。参照がある場合、カウンタは 1 になり、参照が期限切れになると、カウンタは -1 になります。 。カウンタが 0 である限り、オブジェクトは使用できなくなります。
このアルゴリズムはほとんどの場合に適切な選択であり、有名な応用例もいくつかあります。ただし、Java 仮想マシンでは使用されません。
利点: 実装が簡単で判定効率が高い。
欠点: オブジェクト間の循環参照の問題を解決するのは困難です。たとえば、次の例
Object a = new Object(); Object b = new Object(); a=b; b=a; a=b=null; //这样就导致gc无法回收他们。
では、「GC Roots」と呼ばれる一連のオブジェクトを開始点として使用し、これらのノードから下方向に検索してパスを検索します。渡されるパスは参照チェーンと呼ばれます。オブジェクトが GC ルートへの参照チェーンを使用しない場合、そのオブジェクトは使用できないことを意味します。
主流の商用プログラミング言語 (Java、C# など) の主流の実装では、オブジェクトが生きているかどうかを判断するために到達可能性分析が使用されます。
次の図を見ると、gc root とオブジェクト表示の関係がはっきりとわかります。灰色の領域にあるオブジェクトは生きており、Object5/6/7 はすべてリサイクル可能なオブジェクトです。
Java 言語では、GC ルートとして使用できるオブジェクトには、次のタイプ
仮想マシン スタックで参照されるオブジェクト (スタック フレームのローカル変数テーブル)
メソッド内の静的変数によって参照されるオブジェクトエリア
メソッド内の定数によって参照されるオブジェクトエリア
利点: より正確かつ厳密に、循環データ構造の相互参照を分析できます;
欠点: 実装は次のとおりです。大量のデータの分析には多くの時間がかかり、分析プロセスには GC の一時停止 (参照関係は変更できません)、つまりすべての Java 実行スレッドの停止 (「Stop The World」と呼ばれます。これが重要です) が必要ですガベージコレクションの問題)。
2: 参照jdk1.2 以降、Java は参照の概念を拡張しました。参照は一般に、強参照、ソフト参照、弱参照、仮想参照の 4 つのカテゴリに分類されます。 4 引用の強度は徐々に弱まります。強参照: Object obj = new Object(); など、コード内で一般的な参照を指します。 引き続き存在できるのは強参照のみです。の場合、GC は参照されたオブジェクト を収集しません。
ソフトリファレンス: 便利ではあるが必須ではないいくつかのオブジェクトを指します。 十分なメモリ領域がなくなるまで (OutOfMemoryError がスローされる前)、ガベージ コレクションは実行されません。 SoftReference クラスを使用してソフト参照を実装します
##弱い参照: 必須ではないオブジェクトを記述するために使用されます。 このようなオブジェクトは、ガベージ コレクターが動作するときにリサイクルされます。弱参照を実装するには、WeakReference クラスを使用します。
仮想参照: オブジェクトに仮想参照があるかどうか、 # 生存時間にはまったく影響しません。唯一の目的は、オブジェクトがリサイクルされたときにシステム通知を受け取ることです。 2.1 オブジェクトの寿命を決定します。または死
: このオブジェクトが Finalize() メソッドを実行する必要があるかどうかを判断します。
フィルタ結果: オブジェクトがfinalize()メソッドをカバーしていない場合、またはfinalize()メソッドがJVMによって実行されている場合、そのオブジェクトは再利用可能なオブジェクトであると判断されます。オブジェクトが Finalize() メソッドを実行する必要がある場合、そのオブジェクトは F-Queue キューに配置されます。このメソッドは、JVM で自動的に作成された、優先度の低いファイナライザー スレッド (場合によっては複数のスレッド) で後でトリガーされます。オブジェクトは 2 回マークされます。
3. Finalize() メソッド
finalize() は Object クラスのメソッドであり、システムによって自動的に呼び出されるのは 1 回だけです。オブジェクトは、finalize() メソッドによって再度呼び出されることはありません。特別な注意: 自己救済のためにプログラム内で Finalize() を呼び出すことはお勧めできません。 Java プログラムではこのメソッドの存在を忘れることをお勧めします。
実行時間が不確実で、実行されるかどうかさえ不確実であり(Javaプログラムの異常終了)、実行コストが高く、各オブジェクトの呼び出し順序が保証できない(別スレッドで呼び出されても)ため)。 3: リサイクル方法領域永続世代のガベージ コレクションは、主に 放棄された定数と不要なクラスの 2 つの部分に分かれます。 3.1 破棄された定数のリサイクル
文字列「abc」が定数プールに入っているが、現在のシステムには abc という文字列オブジェクトが存在しないとします。つまり、文字列オブジェクトへの参照がありません。 abc 定数を指しており、このリテラルを他の場所で参照する必要はありません。メモリのリサイクルが発生すると、定数 abc が定数プールからクリアされます。定数プール内の他のクラス (インターフェイス)、メソッド、およびフィールドのシンボリック参照もこれと同様です。 3.2 役に立たないクラスのリサイクル
このクラスのすべてのインスタンスはリサイクルされています。つまり、Java ヒープには変更されたクラスのインスタンスはありません。
このクラスをロードした ClassLoader はリサイクルされました。
Java 開発グラフィック チュートリアル
、以上がJava 学習 Jvm ガベージ コレクター (基本)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。