Java では、参照タイプには 1. 強参照、2. ソフト参照、3. 弱参照、4. ファントム参照が含まれます。
Java 参照型
Java 型には、通常、基本データ型と参照データ型の 2 つのタイプがあります。 。このうち参照データ型とは、Java オブジェクト指向の機能の 1 つであり、ストレージ ヒープ内で参照する必要があるオブジェクトを指します。
JDK1.2 以降、Java の参照型は次の 4 種類に分類されます。
①強参照 (StrongReference)
②ソフト参照 (SoftRefernce)
③弱参照(WeakReference)
④ファントム参照(PhantomReference)
強参照-強参照
この種の参照は通常、最も一般的です。開発中に使用されたもの (Stringstrong=newString("StrongReference") など)、インスタンス オブジェクトに強参照がある場合、ガベージ コレクターはオブジェクトをリサイクルしません。メモリが不足している場合は、メモリをリサイクルするのではなく、OutOfMemeryError 例外をスローします。強参照。参照されるオブジェクト。JVM は強参照オブジェクトがユーザーによって使用されているオブジェクトであると考えるため、どれをリサイクルすべきかを判断できません。強制的にリサイクルすると、システムに重大なエラーが発生する可能性があります。
ソフト参照-SoftReference
オブジェクトにソフト参照しかない場合、JVM はメモリが不足している場合にのみオブジェクトをリサイクルし、メモリが不足している場合はリサイクルしません。他の場合。ソフト参照は ReferenceQueue と組み合わせて使用でき、システム メモリ不足によりソフト参照のオブジェクトがリサイクルされると、JVM は関連する ReferenceQueue にソフト参照を追加します。
ReferenceQueuereferenceQueue=newReferenceQueue(); SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue); Bookbook=softReference.get(); Referencereference=referenceQueue.poll();
システム メモリが不足すると、gc がトリガーされ、Book がリサイクルされ、参照は null になりません。
弱い参照-WeakReference
弱い参照オブジェクトのみがあり、JVM が gc をトリガーすると、オブジェクトはリサイクルされます。ソフト参照とは異なり、弱い参照は、メモリが不足しているかどうかに関係なくリサイクルされます。弱参照は ReferenceQueue と組み合わせて使用できます。システムが gc をトリガーし、ソフト参照オブジェクトがリサイクルされると、JVM は関連する ReferenceQueue に弱参照を追加します。ただし、ガベージ コレクター スレッドの優先順位は非常に低いため、弱い参照はすぐにはリサイクルされない可能性があります。以下は、この結論を検証するために gc をアクティブにトリガーする例です。
ReferenceQueuereferenceQueue=newReferenceQueue(); WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue); Bookbook=softReference.get(); System.gc(); //Runtime.getRuntime().gc(); Referencereference=referenceQueue.poll();
もちろん、これを毎回再現できるわけではありません。これは、単に System.gc() を呼び出して、JVM にガベージを収集する時期が来たことを通知するためです。しかし、それがいつ実行されるかは定かではありません。 , しかし、私がテストした限りでは、あと数回 System.gc() を記述する限り、再発の可能性は依然として非常に高いようです。
仮想参照 - PhantomReference
オブジェクトにそれを参照する仮想参照しかない場合、ガベージ コレクターはいつでもそれをリサイクルできます。仮想参照は主に追跡するために使用されます。ガベージ コレクターによってリサイクルされているオブジェクトのアクティビティ。リサイクルされると、JVM はこの弱い参照を関連する ReferenceQueue に追加します。
ソフト参照や弱参照とは異なり、仮想参照には ReferenceQueue が関連付けられている必要があります。phantomReference.get() で取得した値は null です。関連付けられた ReferenceQueue がない場合を想像してください。値は何ですか?存在の?
PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue); Bookbook=phantomReference.get();//此值为null Referencereference=referenceQueue.poll();
推奨チュートリアル: "java チュートリアル"
以上がJava 参照型とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。