GC到達性分析回収アルゴリズムは循環参照問題を解決する.

3379 ワード

JVMの回収アルゴリズムは参照カウントアルゴリズムであり、対象が一回引用されるたびに、+1、一つの引用をリリースして-1であり、ゴミが回収される時、参照を0と数える対象はGCによって除外される.しかし、この方法には問題があります.循環参照の問題は解決できません.
循環参照とは、対象Aが対象Bを参照し、対象Bが対象Aを参照し、参照リングを構成することである.お互いには何の役にも立たないのに、GCは使えない.この問題を解決するために、可能性のある分析回収アルゴリズムがあります.
到達可能性の分析:
アルゴリズムではいくつかのGC Rootオブジェクトを定義していますが、これらのrootオブジェクトはGCではJVMに回収されません.これらのオブジェクトを木の枝のように外に拡張し、参照されたオブジェクト説明はまだ生きています.GCには使用されません.これらのrootオブジェクトに引用されていないとGCに落ちます.循環参照問題を解決しました.
Rootオブジェクトは主に以下を含む.
①システム類のキャリア(bootstrap)にロードされているクラス.
②JVMメソッドエリアにおける静的属性参照の対象.
③JVM定数池で参照する対象.
④JVM仮想マシンスタックで参照するオブジェクト.
⑤JVMローカルメソッドスタックで参照する対象.
⑥活動しているスレッド.
公式解釈:
GC roots

The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.

There are several kinds of GC roots. One object can belong to more than one kind of root. The root kinds are:

Class - class loaded by system class loader. Such classes can never be unloaded. They can hold objects via static fields. Please note that classes loaded by custom class loaders are not roots, unless corresponding instances of java.lang.Class happen to be roots of other kind(s).
Thread - live thread
Stack Local - local variable or parameter of Java method
JNI Local - local variable or parameter of JNI method
JNI Global - global JNI reference
Monitor Used - objects used as a monitor for synchronization
Held by JVM - objects held from garbage collection by JVM for its purposes. Actually the list of such objects depends on JVM implementation. Possible known cases are: the system class loader, a few important exception classes which the JVM knows about, a few pre-allocated objects for exception handling, and custom class loaders when they are in the process of loading classes. Unfortunately, JVM provides absolutely no additional detail for such objects. Thus it is up to the analyst to decide to which case a certain "Held by JVM" belongs
 
強引用:
強引用とは、newによって作成されたオブジェクトを参照することです.root検索アルゴリズムの中で、引用というのは強い引用関係を指します.
Object obj=new Object()objという変数はobjectオブジェクトを引用して、Objという参照だけが解放されて、対象はGCになります.
たとえば
Obj=nullこのようにオブジェクトは釈放されます.
ソフト参照:
ソフト引用の対象はメモリが足りない時だけ回収されます.GCの場合、メモリが十分にあるとソフト引用タイプは回収されません.
ソフト引用の役割は、ソフト参照がメモリの敏感なキャッシュを実現するために使用されます.メモリが十分であれば、ずっとメモリに保存して、データのアクセス速度を速めることができます.メモリが足りないとキャッシュは回収されます.
Object obj=new Object()SoftReference softReference=new SoftReference<>(obj)
弱引用:
弱い引用は短い時間しか生きられません.初めてGCを経験した時、メモリが十分かどうかにかかわらず、回収されます.
弱い引用の役割は、対象が偶尔的に使われ、いつでも使えるようにしたいが、対象のゴミ収集に影響を与えたくないなら、弱い引用タイプに対象を修飾することができるということです.弱い引用はまた、対象がすでにゴミ回収器によって回収されるごみとしてマークされているかどうかを監視するために使用されてもよく、弱い引用のisenQued方法で対象に戻ります.もう一つのケースがあります.対象を引用したいなら、その対象は自分のライフサイクルがあります.この対象のライフサイクルに介入したくないなら、弱い引用が使えます.
Object obj=new Object()WeakReference weak Reference=new Weak Reference(obj)
虚引用:
虚引用とは偽の引用であり、対象が虚引用に関連している場合は、引用と関連がない場合と同じように、いつでもごみ箱に回収される可能性があります.虚引用は引用列に合わせて使用しなければなりません.
虚引用の役割:虚引用は列を引用して使用しなければならないので、ゴミ回収器が一つの対象を回収しようとする時、虚引用があることを発見すれば、この虚引用を関連する引用列に加えることができます.したがって、プログラムは参照列に虚引用が入っているかどうかを判断することによって、参照対象がゴミ回収されるかどうかを知ることができます.プログラムが何らかの虚参照が参照キューに追加されていることを発見した場合、参照対象のメモリが回収される前に必要な行動をとることができます.
Object obj=new Object()ReferenceQue queue=new ReferenceQue()PhotomReference pf=new PhotomReference(obj,queue)