Java语言的优点之一是它自动管理内存,程序员无需承担内存管理的负担,也无需担心当不再需要对象时释放对象的内存。 java垃圾收集器线程为程序员做这件事;它在JVM的控制下清除不需要的对象并释放内存。程序员还可以通过使用 java.lang.ref 类来控制何时对对象进行垃圾收集。 java 中的引用有四种类型,具体取决于垃圾收集的方式或垃圾收集器对引用的行为。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
根据垃圾收集器对引用的行为,Java 引用有四种类型。
强引用通常是我们在编写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中文网其他相关文章!