強い引用、柔らかい引用、弱い引用、仮想引用の概念
強い参照
強い引用は、プログラムコードの一般的な引用を指します。たとえば、次のコードのオブジェクトとSTRはどちらも強力な引用です。
object object = new object();文字列str = "hello";
オブジェクトがそれに関連する強力な参照を持っている限り、JVMは間違いなくこのオブジェクトをリサイクルしません。メモリがない場合でも、JVMは、そのようなオブジェクトをリサイクルするよりも、むしろoffmemoryエラーを投げたいと思います。
たとえば、次のコード:
public class main {public static void main(string [] args){new main()。fun1(); } public void fun1(){object object = new object(); Object [] objarr = new Object [1000]; }}オブジェクトに実行するとき[] objarr = new object [1000];この文で実行するとき、メモリが不十分な場合、JVMはOOMエラーをスローし、オブジェクトによって指されたオブジェクトをリサイクルしません。ただし、fun1が実行された後、オブジェクトとobjarrの両方が存在しなくなるため、彼らが指すオブジェクトはJVMによってリサイクルされることに注意する必要があります。
強力な参照とオブジェクトの間の関連性を中断する場合は、nullへの参照を表示して、JVMが適切な時期にオブジェクトをリサイクルするようにすることができます。
softreference
ソフト参照は、いくつかの有用ではあるが必要ではないオブジェクトを記述するために使用され、java.lang.ref.softreneferenceクラスを使用してJavaで表されます。関連するオブジェクトのソフト参照の場合、JVMはメモリが不十分な場合にのみオブジェクトをリサイクルします。したがって、これはOOMの問題を解決するためによく使用できます。この機能は、Webページキャッシュ、画像キャッシングなど、キャッシュの実装に非常に適しています。
ソフトリファレンスは、参照キュー(リファレンスキュー)と組み合わせて使用できます。ソフト参照によって参照されるオブジェクトがJVMによってリサイクルされた場合、ソフト参照が関連する参照キューに追加されます。使用の例は次のとおりです。
java.lang.ref.weakreferenceをインポートします。 public class main {public static void main(string [] args){weakreference <string> sr = new weakreference <string>(new String( "hello")); System.out.println(sr.get()); System.gc(); // JVMのGCに通知して、Garbage Collection System.out.println(sr.get())を実行するように通知します。 }}弱者
弱い参照は、非必須オブジェクトを記述するためにも使用されます。 JVMがガベージコレクションを実行すると、メモリで十分かどうかに関係なく、弱い参照に関連付けられたオブジェクトがリサイクルされます。 Javaでは、java.lang.ref.weakreferenceクラスを使用してそれを表現します。使用の例は次のとおりです。
java.lang.ref.weakreferenceをインポートします。 public class main {public static void main(string [] args){weakreference <string> sr = new weakreference <string>(new String( "hello")); System.out.println(sr.get()); System.gc(); // JVMのGCに通知して、Garbage Collection System.out.println(sr.get())を実行するように通知します。 }}幻想
仮想参照は、以前のソフト参照や弱い参照とは異なり、オブジェクトのライフサイクルに影響しません。 Javaでは、java.lang.ref.phantomreferenceクラスを使用してそれを表現します。オブジェクトが仮想参照に関連付けられている場合、参照が関連付けられていないように、ガベージコレクターによっていつでもリサイクルされる場合があります。
仮想参照は、参照キューに関連して使用する必要があることに注意する必要があります。 Garbage Collectorがオブジェクトをリサイクルする準備をしている場合、仮想参照があることがわかった場合、この仮想参照を関連する参照キューに追加します。このプログラムは、参照オブジェクトが、仮想参照が参照キューに追加されたかどうかを判断することにより、ガベージに収集されるかどうかを理解できます。プログラムが仮想参照が参照キューに追加されたことを発見した場合、参照されるオブジェクトのメモリがリサイクルされる前に必要なアクションをとることができます。
柔らかい引用と弱い引用のさらなる理解
コードを書くときに強力な引用を使用することがよくあります。他の3種類の引用について、最も一般的に使用されるのは、ソフトな引用と弱い引用です。これら2つには、類似点と違いの両方があります。これらはすべて非必須オブジェクトを記述するために使用されますが、ソフト参照に関連付けられたオブジェクトはメモリが不十分な場合にのみリサイクルされますが、JVMがガベージを収集すると、弱い参照に関連付けられたオブジェクトは常にリサイクルされます。上記の機能を考慮すると、ソフト参照はキャッシュに適しています。メモリが不十分な場合、JVMはメモリをリサイクルできます。弱い参照を使用して、コールバック関数のメモリリークを防ぐことができます。多くの場合、コールバック関数は匿名の内部クラスであり、コールバック関数が別のスレッドで呼び出された場合、およびこの時点で外部クラスをリサイクルする必要がある場合、匿名の内部クラスが外部クラスに強い参照を保存するため、外部クラスをリサイクルする必要がある場合、暗黙的に外部クラスへの参照を保存することが多いためです。
上記の記事では、Javaの4つの引用方法の違いについて簡単に説明しています。私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。