Java中四种引用类型
来源:互联网 发布:广西广电网络宽带价钱 编辑:程序博客网 时间:2024/06/08 17:15
一、概念介绍
强引用:
只要引用存在,垃圾回收器永远不会回收
Object obj = new Object();
//可直接通过obj取得对应的对象 如obj.equels(new Object());
而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。
软引用:
非必须引用,内存溢出之前进行回收,可以通过以下代码实现
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有时候会返回null
这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。
弱引用:
第二次垃圾回收时回收,可以通过如下代码实现
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。
虚引用:
垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除
虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
虚引用主要用于检测对象是否已经从内存中删除。
二、应用示列
首先来俩个公用类MyDate,ReferenceTest
MyDate.java
public class MyDate extends Date {/* * finalize()函数是在JVM回收内存时执行的, * 但JVM并不保证在回收内存时一定会调用finalize()。 */public MyDate() {}// 覆盖finalize()方法protected void finalize() throws Throwable {super.finalize();System.out.println("obj [Date: " + this.getTime() + "] is gc");}public String toString() {return "Date: " + this.getTime();}}
ReferenceTest.java
public class ReferenceTest {public ReferenceTest() {}// 消耗大量内存(模拟)public static void drainMemory() {String[] array = new String[1024 * 10];for (int i = 0; i < 1024 * 10; i++) {for (int j = 'a'; j <= 'z'; j++) {array[i] += (char) j;}}}}
接下来就是各种应用
2.1 强引用
public class StrongReferenceTest {public static void main(String[] args) {MyDate date = new MyDate();System.gc();}}
测试结果:
结论:即使显式调用了垃圾回收,但是用于date是强引用,date没有被回收。
2.2 弱引用
public class WeakReferenceTest {public static void main(String[] args) {WeakReference ref = new WeakReference(new MyDate());//耗内存操作ReferenceTest.drainMemory();}}
测试结果:obj [Date: 1509671151225] is gc结论:在JVM垃圾回收运行时,弱引用被终止.
2.3 软引用
public class SoftReferenceTest {private static ReferenceQueue<MyObject> softQueue = new ReferenceQueue<>();public static class MyObject {byte[] bytes = new byte[23 * 1024];protected void finalize() throws Throwable {super.finalize();System.out.println("MyObject's finalize called");}public String toString() {return "I am MyObject";}}public static void main(String[] args) {MyObject object = new MyObject();SoftReference<MyObject> softRef = new SoftReference<>(object, softQueue);object = null; // 删除强引用System.gc();System.out.println("After GC : Soft Get = " + softRef.get());System.out.println("分配大块内存");byte[] b = new byte[5 * 1024 * 928];System.out.println("After new byte[]: Soft Get = " + softRef.get());System.gc();}
当我设置-Xmx5m时,测试结果为:
After GC : Soft Get = I am MyObject
分配大块内存
MyObject's finalize called
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.wuquan.bquate.SoftReferenceTest.main(SoftReferenceTest.java:29)
当设置内存足够大时,比如-Xmx502m,测试结果为:
After GC : Soft Get = I am MyObject
分配大块内存
After new byte[]: Soft Get = I am MyObject
这说明在分配大块内存时,内存容量不够时,会回收弱引用对象。但是申请的内存超过虚拟机的最大内存必然会导致内存溢出。
结论:对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。
2.4 虚引用
public class PhantomReferenceTest {public static void main(String[] args) {ReferenceQueue queue = new ReferenceQueue();PhantomReference ref = new PhantomReference(new MyDate(), queue);System.gc();}}
测试结果:obj [Date: 1509672245485] is gc
结论:在JVM垃圾回收运行时,虚引用被终止.
可以用以下表格总结上面的内容:
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- java中四种引用类型
- Java中四种引用类型
- 引用 网页层叠z-index用法详解(转载)
- mybatis 的一级缓存和二级缓存
- 20171102--NPM的介绍和使用
- Java多线程编程-(18)-等待/通知模式接口Condition接口深入分析
- Ubuntu16.04更新4.13.8内核.md
- Java中四种引用类型
- JAVA 注解
- 自连接
- jsp中${name}这个怎么用的?
- android 网络连接的判断
- Spring.xml事物配置
- 深入理解java虚拟机
- sleep func
- Fragment加RadioGroup show和hide