GCの基本的な要約

I.概要

データ領域 共有するかどうか リサイクル計画
プログラムカウンター バツ 同じスレッドまたはメソッドが停止してリサイクルします
仮想マシンスタック バツ 同じスレッドまたはメソッドが停止してリサイクルします
ネイティブメソッドスタック バツ 同じスレッドまたはメソッドが停止してリサイクルします
メソッドエリア GC処理
ヒープ GC処理

スレッドによって共有されていない領域のデータ収集は、メソッドおよびスレッド全体の終わりによっても決定できるため、GCによって処理されるオブジェクトはメソッド領域とヒープです。
次に、ヒープ内の破棄されたオブジェクトを特定する方法

アルゴリズム エイリアス 使用言語 利点 不利益
参照カウント 参照カウント Python 引用数が記録されている限り、原理は単純で効率は高い 相互循環参照の状況を判断することは困難です
アクセシビリティ分析 到達可能性分析 JAVA / C# GC ROOTSを通じて、誰が効果的に使用されているかを明確に知ることができます 低効率

JAVAは到達可能性分析方法を使用します。到達可能性分析メソッドのGCRoots設定は非常に重要です。現在、次のものが含まれています
。1。仮想マシンスタックのローカル変数テーブルで参照されるオブジェクトは、プログラムの各スレッドで使用できるパラメーター、ローカル変数、一時変数などに対応します。
2.ネイティブメソッドスタックでJNIによって参照されるオブジェクト。
3.同期によって保持されているすべてのオブジェクト。
4.文字列テーブルの参照など、メソッド領域の定数によって参照されるオブジェクト。
5. Javaクラスの静的変数の参照など、メソッド領域の静的プロパティによって参照されるオブジェクト。
6.基本データ型に対応するClassオブジェクト、一部の常駐例外、システムローダーなど、JAVA仮想マシン自体の内部参照。
7. Java仮想マシンの内部状況、JVMTIに登録されたコールバック、ローカルコードキャッシュなどを反映するJMXBean。
8.一時的に追加される可能性のあるいくつかの特別なオブジェクトもあります。世代別回収、部分リサイクルなど。
3.
JDK1.2より前定義の引用:参照型データに格納されている値が別のメモリの開始アドレスを表す場合、それはメモリまたはオブジェクトへの参照であると言われます。
JDK1.2以降に拡張:参照は、強参照、ソフト参照、弱参照、およびファントム参照に分けられます。強い参照のみがリサイクルされません。他の参照は安全ではありません。
4.
GCを保持しても、到達不能なオブジェクトが見つかった場合、オブジェクトはすぐに強制終了されません。その前に、GCは最初にオブジェクトに何を持っているかを尋ねます。オブジェクトに意志がない場合は、その場で強制終了されます。 。意志がある場合(finalize()メソッドをオーバーライド))、手続きを経てキューアップ処理(F-Queue)を実行するように調整します。
死刑囚は、手続きを行う際に管財人のところに行って関係を見つけることができます。太もも(GCルーツ)を抱きしめれば、死刑を免れることができます。彼らが無意味な場合は、実行後にその場で死にます。意志。
ただし、死刑囚の遺言が非常に奇妙で、GCに影響を与えて、後の死刑囚の遺言を実現する死刑囚が常に少数いることに注意する必要があります。最後の手段として、GCは無責任に意志を実行することしかできず、実行の結果を待つことはありません。これは、willメソッド(finalize)の使用が信頼できないことを示しています。プログラムでこの関数を使用することは避けてください。

おすすめ

転載: blog.csdn.net/weixin_44159662/article/details/107755849