Java参照

2556 ワード

強引用、弱引用、ソフト引用、虚引用を含む。
強引用:
強引用は最も一般的な参照を使用します。もし一つの対象が強い引用を持っているなら、ゴミ回収器は決して回収しません。メモリの空間が足りない時、Java仮想マシンはOutOfMemoryErrエラーを抛り出してもよく、プログラムを異常終了させても、強い参照を持つオブジェクトを自由に回収してメモリ不足の問題を解決しません。  ps:強引用とは、実は私達が普段A=new A()という意味です。
引用が存在する限り、ゴミ回収器は永遠に回収されません。
 Object obj = new Object(); //     obj         obj.equels(new Object());
このように、Objectの後のnew Objectに対する強い引用は、Objのこの引用が解放された後だけ対象が解放されます。これも私達がよく使う符号化形式です。
ソフト参照:
もし一つのオブジェクトがソフト参照しか持っていないなら、メモリのスペースが十分です。ゴミ回収器は回収されません。メモリ容量が足りないと、これらのオブジェクトのメモリが回収されます。ゴミ回収器が回収されていない限り、対象はプログラムで使用できます。ソフト参照は、メモリに敏感なキャッシュ(以下、例を示す)を実現するために使用されてもよい。
ソフト引用は参照列と連携して使用できます。ソフト引用で参照されたオブジェクトがごみ箱に回収されると、Java仮想マシンはこのソフトを関連する参照列に追加します。
参照する必要はありません。メモリがオーバーフローする前に回収します。以下の代発で実現できます。
Object obj = new Object();
SoftReference sf = new SoftReference(obj);
obj = null;
sf.get();//      null
このようにsfはobjectのソフト参照であり、sf.get()法によりこのオブジェクトを取得することができます。もちろん、このオブジェクトが回収対象としてマークされた場合、nullに戻ります。
ソフト引用の主要ユーザーは同様のキャッシュ機能を実現し、メモリが十分な場合はソフト参照によって直接値を取り、多忙なソースからデータを照会する必要がなく、速度を上げる。メモリが不足している場合、自動的にこの部分のキャッシュデータを削除して、本当のソースからこれらのデータを調べます。
弱引用:
弱い引用とソフト引用の違いは、弱い引用の対象だけがより短いライフサイクルを持つことです。ゴミ回収スレッドが所管するメモリ領域をスキャンする過程で、弱い参照のみの対象が発見されると、現在のメモリ空間が十分であるかどうかにかかわらず、メモリが回収されます。ただし、ゴミ回収器は優先度が低いスレッドであるため、弱い参照のみの対象がすぐに見つかるとは限らない。弱い引用は引用列と連携して使用することができ、弱い引用の対象がごみによって回収されると、Java仮想マシンはこの弱い引用を関連する参照列に加えることができる。
第二次ごみの回収は、次のコードにより実現できます。
Object obj = new Object(); 
WeakReference wf = new WeakReference(obj); 
obj = null; 
wf.get();//      null 
wf.isEnQueued();//                    
弱引用は第二次ごみの回収時に回収し、短時間で弱い引用で対応データを取り、第二次ごみの回収を行った時にnullに戻ります。
弱引用は主に対象を監視するために使用されていますが、ゴミ回収器によって回収されるゴミとしてマークされていますか?弱い引用のisenQued方法で対象に戻ります。
虚引用:
「虚引用」はその名の通り虚構であり、他の幾つかの引用とは違って、虚引用は対象のライフサイクルを決定しない。もし一つのオブジェクトが虚引用だけを持っているなら、それは何の引用もないのと同じで、いつでもごみ箱に回収されます。虚引用は主に対象のゴミ回収器の回収活動を追跡します。
虚引用と軟引用と弱引用の違いは、虚引用は引用列と連携して使用しなければならないということです。
ゴミ回収器が一つの対象を回収しようとすると、虚引用があると発見されると、対象のメモリを回収する前に、この虚引用を関連する引用列に追加します。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue); 
ゴミ回収時の回収は、引用で対象値を取ることができません。下記のコードで実現できます。
Object obj = new Object();
PhantomReference pf = new PhantomReference(obj);
obj=null;
pf.get();//    null
pf.isEnQueued();//            
虚引用はゴミを回収するたびに回収され、虚引用のget方法で永遠に入手したデータがnullであるため、幽霊引用にもなっている。
虚引用は主に対象がメモリから削除されたかどうかを検出するために使用されます。