网监关闭的网站怎么恢复,免费网站整站模板源码,oj网站开发,中国中小企业信息网Java 中都有哪些引用类型#xff1f;
强引用
在 Java 中最常见的就是强引用#xff0c;把一个对象赋给一个引用变量#xff0c;这个引用变量就是一个强引用。当一个对象被强引用变量引用时#xff0c;它处于可达状态#xff0c;它是不可能被垃圾回收机制回收的。因此强引…Java 中都有哪些引用类型
强引用
在 Java 中最常见的就是强引用把一个对象赋给一个引用变量这个引用变量就是一个强引用。当一个对象被强引用变量引用时它处于可达状态它是不可能被垃圾回收机制回收的。因此强引用是造成 Java 内存泄漏的主要原因之一。
Object obj new Object(); //只要obj还指向Object对象Object对象就不会被回收
obj null; //手动置null
只要强引用存在垃圾回收器将永远不会回收被引用的对象哪怕内存不足时JVM也会直接抛出OutOfMemoryError不会去回收。如果想中断强引用与对象之间的联系可以显示的将强引用赋值为null这样一来JVM就可以适时的回收对象了
软引用
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候软引用对象不会被回收只有在内存不足时系统则会回收软引用对象如果回收了软引用对象之后仍然没有足够的内存才会抛出内存溢出异常。这种特性常常被用来实现缓存技术比如网页缓存图片缓存等。 在 JDK1.2 之后用java.lang.ref.SoftReference类来表示软引用。
在运行下面的Java代码之前需要先配置参数 -Xms2M -Xmx3M将 JVM 的初始内存设为2M最大可用内存为 3M。
public class TestOOM {private static ListObject list new ArrayList();public static void main(String[] args) {testSoftReference();}private static void testSoftReference() {for (int i 0; i 10; i) {byte[] buff new byte[1024 * 1024];SoftReferencebyte[] sr new SoftReference(buff);list.add(sr);}System.gc(); //主动通知垃圾回收for(int i0; i list.size(); i){Object obj ((SoftReference) list.get(i)).get();System.out.println(obj);}}}
打印结果 我们发现无论循环创建多少个软引用对象打印结果总是只有最后一个对象被保留其他的obj全都被置空回收了。 这里就说明了在内存不足的情况下软引用将会被自动回收。
弱引用
弱引用需要用 WeakReference 类来实现它比软引用的生存期更短对于只有弱引用的对象来说只要垃圾回收机制一运行不管 JVM 的内存空间是否足够总会回收该对象占用的内存。
private static void testWeakReference() {for (int i 0; i 10; i) {byte[] buff new byte[1024 * 1024];WeakReferencebyte[] sr new WeakReference(buff);list.add(sr);}System.gc(); //主动通知垃圾回收for(int i0; i list.size(); i){Object obj ((WeakReference) list.get(i)).get();System.out.println(obj);}}
虚引用
虚引用Phantom Reference是Java中四种引用类型之一也是最弱的一种引用类型。虚引用的作用是帮助对象在被垃圾回收器回收时可以在回收之前进行必要的清理工作。虚引用并不能通过它访问对象本身也不能通过它访问对象的任何属性或方法因为它的get()方法总是返回null。虚引用主要用于管理堆外内存例如NIO Direct Memory中的内存。当虚引用所引用的对象被垃圾回收器回收时虚引用会被放入一个ReferenceQueue中以便在必要时进行清理工作。虚引用一般与ReferenceQueue一起使用通过检查ReferenceQueue中的引用对象可以确定对象已经被回收从而进行相关的清理工作。虚引用通常由java.lang.ref.PhantomReference类来实现。
public class PhantomReferenceT extends ReferenceT {/*** Returns this reference objects referent. Because the referent of a* phantom reference is always inaccessible, this method always returns* codenull/code.** return codenull/code*/public T get() {return null;}public PhantomReference(T referent, ReferenceQueue? super T q) {super(referent, q);}
}
引用队列ReferenceQueue
引用队列ReferenceQueue是Java中用于管理引用对象的队列。当一个对象被垃圾回收器回收时如果该对象有一个与之关联的引用队列那么该引用对象就会被放入该引用队列中。通过引用队列可以确定对象是否被垃圾回收器回收从而进行相关的清理工作。
引用队列通常与弱引用、软引用和虚引用一起使用。当弱引用、软引用或虚引用所引用的对象被垃圾回收器回收时会将该引用对象放入与之关联的引用队列中。通过检查引用队列中的引用对象可以确定对象已经被回收从而进行必要的清理工作。
引用队列的使用非常灵活可以根据不同的需求来选择不同的引用类型和清理工作。例如对于一些需要进行资源释放的对象可以使用虚引用和引用队列来进行资源的清理工作。
骚戴理解注意引用队列并不可以和强引用一起使用与软引用、弱引用不同虚引用必须和引用队列一起使用。