カウントアルゴリズムを通じてオブジェクトへの参照の数を判断するか、ルート検索アルゴリズムを通じてオブジェクト参照チェーンに到達可能かどうかを判断するかどうか、オブジェクトが生きているかどうかを判断することは「参照」に関連します。
参照は主に強参照、ソフト参照、弱参照、ファントム参照の4種類に分けられ、順番に参照の強度が急激に低くなります。
は、「Object objectRef = new Obejct」のような、コード内で遍在するものを参照します。強参照である限り、GC によってクリーンアップされることはありません。まだ存在しています。 。
は、Jvm がメモリ不足になった場合 (メモリ オーバーフロー前)、GC の実行後にリサイクルされます。まだ十分なスペースがありません。メモリ オーバーフロー例外がスローされます。
ソフト参照は SoftReference クラスを通じて実装されます。SoftReference はキャッシュの実装に非常に適しています。さらに、スキャンされた SoftReference が頻繁に使用されないと GC が判断した場合、それはリサイクルされる可能性があります。
使い方:
User user = new User(); SoftReference<Object> softReference = new SoftReference<Object>(user); softReference.get();
弱参照は、有用ではあるが必ずしも存在するとは限らないオブジェクトを記述するためにも使用され、その強度はソフト参照と関連付けられるものよりも弱くなります。弱参照のオブジェクトは、メモリが十分であるかどうかに関係なく、次の GC まで存続できます。 JDK は、WeakReference クラスを通じてこれを実装します。
取得する場合は、weakReference.get メソッドを通じて取得できます。このメソッドは null を返す場合があります
ReferenceQueue オブジェクトを WeakReference コンストラクターに渡すことができます。参照オブジェクトがリサイクル可能として表される場合、isEnqueued は true を返します
。
User user = new User(); WeakReference<User> weakReference = new WeakReference<User>(user); weakReference.get(); ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>(); WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue); //当引用对象被标识为可回收时 返回true, 即当user对象标识为可回收时,返回true weakReference.isEnqueued();
仮想参照は「ファントム参照」と呼ばれ、オブジェクトが仮想参照を持っているかどうかは生存時間にはまったく影響しません。オブジェクトの仮想参照関連付けを設定する唯一の目的は、オブジェクトが GC によってリサイクルされたときにシステム通知を受け取ることです。 PhantomReference クラスを通じて実装されます。
phantomReference.get メソッドは常に null を返すことに注意してください。ユーザーがメモリから削除されると、isEnqueued を呼び出すと true が返されます
User user = new User(); ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>(); PhantomReference<User> phantomReference = new PhantomReference<User>(user, referenceQueue); //即当user对象标识为可回收时,返回true System.out.println(phantomReference.isEnqueued()); //永远返回null System.out.println(phantomReference.get());
WeakCache weakCache = new WeakCache(); SoftCache softCache = new SoftCache(); WeakHashMap weakHashMap = new WeakHashMap();
。
ガベージ コレクション メカニズムが実行され、参照関係がスキャンされると、GC はこれら 3 つのタイプの参照を異なる方法で処理します。簡単に言えば、GC はスキャンされた参照が Reference タイプであるかどうかを最初に判断します。参照型とその参照先のオブジェクトに強い参照がない場合、そのオブジェクトは対応する参照型であるとみなされ、その後のガベージ コレクション中に、これらのオブジェクトはさまざまな参照型に従って処理されます。
上記は Java 仮想マシン学習 - オブジェクト参照の強度の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。