Java 言語の利点の 1 つは、自動的にメモリを管理するため、プログラマはメモリ管理の負担を負う必要がなく、オブジェクトが不要になったときにオブジェクトのメモリを解放することを心配する必要もありません。 Java ガベージ コレクター スレッドはプログラマに代わってこれを行います。 JVM の制御下で不要なオブジェクトを一掃し、メモリを解放します。プログラマは、java.lang.ref クラスを使用して、必要に応じてオブジェクトをいつガベージ コレクションするかを制御することもできます。 Java には、ガベージ コレクションの方法、または参照に対するガベージ コレクターの動作に基づいて、4 つのタイプの参照があります。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
Java 参照には、参照に対するガベージ コレクターの動作に基づいて 4 つのタイプがあります。
強参照は通常、Java コードを作成するとき、またはオブジェクトを作成するときに使用します。強参照を持ち、メモリ内でアクティブなオブジェクトはガベージ コレクションの対象にはなりませんが、null を指す強参照を持つオブジェクトはガベージ コレクションの対象になります。たとえば、以下のコード スニペットでは、変数 ob が ClassA 型のオブジェクトです。
ClassA ob = new ClassA();
「ob」オブジェクトにはクラス ClassA を指す強い参照があります。 ob はアクティブなオブジェクトであるため、このオブジェクトはガベージ コレクションできません。
以下のように参照「ob」が null を指している場合 –
ob = null;
現在、オブジェクトはクラス ClassA を参照していません。オブジェクトはガベージ コレクションの対象になりました。
コード:
package p1; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA(); // default reference or Strong Reference System.out.println(ob); ob = null; // Now object <u>ob</u> pointing to null and is available for garbage collection System.out.println(ob); } }
出力:
弱い参照はガベージ コレクションの対象となります。 JVM が弱い参照を持つオブジェクトを検出すると、このオブジェクトはマークされ、JVM によってガベージ コレクター スレッドが実行されるときにガベージが収集されます。これらのタイプの参照は、オブジェクトのエントリに対して WeakHashMap で使用されます。弱参照は、lang.ref.WeakReference クラスによって作成できます。アプリケーションで使用できる弱参照は、DBConnection を確立し、データベースが閉じられるとガベージ コレクターによって接続が解放されます。たとえば、以下のコード スニペットでは、変数 ob が ClassA 型のオブジェクトです。
ClassA ob = new ClassA();
「ob」オブジェクトはガベージ コレクション可能にするための強参照であり、以下のようにその参照を弱参照に変換する必要があります –
WeakReference<ClassA> weakob = new WeakReference<ClassA>(ob);
これで、オブジェクトはクラス ClassA を弱参照し、オブジェクトはガベージ コレクションに使用できるようになり、JVM がガベージ コレクション スレッドを実行するとガベージ コレクションが行われます。
コード:
package p1; import java.lang.ref.WeakReference; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA(); // default reference or Strong Reference System.out.println(ob); // now create Weak Reference object to which <u>ob</u> object is pointing WeakReference <ClassA> weakob = new WeakReference <ClassA>(ob); // Now <u>ob</u> object is eligible for garbage collection, but it will be remove from memory when JVM needs memory ob = null; System.out.println(ob); // weakly referenced <u>ob</u> object can get back ob = weakob.get(); System.out.println(ob); } }
出力:
ソフト参照のオブジェクトは、JVM がメモリを使い果たすか、JVM が非常にメモリを必要とするまで、ガベージ コレクションの対象になりません。弱参照は、lang.ref.SoftReference クラスによって作成できます。たとえば、ソフト参照は弱参照と同様に作成できます。
SoftReference <ClassA> softob = new SoftReference <ClassA>(ob);
コード:
package p1; import java.lang.ref.SoftReference; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA();// default reference or Strong Reference System.out.println(ob); // now create soft Reference object which ob object is pointing SoftReference <ClassA> softob = new SoftReference <ClassA>(ob); // Now ob object is eligible for garbage collection, but it will be garbage collected when JVM badly needs memory ob = null; System.out.println(ob); // the soft referenced, ob object can get back ob = softob.get(); System.out.println(ob); } }
出力:
ファントム参照のオブジェクトはガベージ コレクションに使用できますが、ガベージ コレクションの前に、オブジェクトは JVM によって「参照キュー」という名前の参照キューに入れられます。オブジェクトに対する Finalize() 関数呼び出しの後。弱参照は、lang.ref クラスによって作成できます。ファントムリファレンス
コード:
package p1; import java.lang.ref.ReferenceQueue; import java.lang.ref.PhantomReference; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA(); // default reference or Strong Reference System.out.println(ob); // now Create Reference queue object ReferenceQueue <ClassA> refq = new ReferenceQueue <ClassA>(); // Create Phantom Reference object to which <u>ob</u> object is pointing PhantomReference <ClassA> phantomob = new PhantomReference <ClassA>(ob,refq); // Now <u>ob</u> object is eligible for garbage collection, but it will be kept in '<u>refq</u>' before removing ob = null; System.out.println(ob); // to get back object which has been Phantom referenced returns null ob = phantomob.get(); System.out.println(ob); } }
出力:
以上がJava リファレンスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。