Java四中引用
程序员文章站
2022-06-18 09:37:10
在JDK1.2以后将对象应用分为4中,强引用,软引用,弱引用,虚引用,这样的方式可以更加灵活控制对象的声明周期 强引用 String str = "123"; 这时我们日常用的引用,只要对象与强引用关联,如果内存不足时,JVM宁愿抛出OutOfMemoryError内存溢出错误也不会回收强引用 如果 ......
在jdk1.2以后将对象应用分为4中,强引用,软引用,弱引用,虚引用,这样的方式可以更加灵活控制对象的声明周期
强引用
string str = "123";
这时我们日常用的引用,只要对象与强引用关联,如果内存不足时,jvm宁愿抛出outofmemoryerror内存溢出错误也不会回收强引用
如果想要jvm回收强引用类型的对象,将其引用更改为null,jvm会在合适的时间回收这个null引用队形
软引用
java中使用softrefence来表示软引用,如果某个对象与软引用关联,那么jvm只有在内存不足时回收该类引用
利用这个特性软引用可以用来做缓存
例如:
softreference<string> srs = new softreference<string>("123"); system.out.println(srs.get()); //123 system.gc(); system.out.println(srs.get());//123
因为内存充足所有无法回收
软引用适合做缓存,在内存足够是,直接通过软引用取值,无需从真实的来源中查询数据,可以显著的提升网站性能,当内存不足时,能让jvm进行回收,从而删除缓存,这时候只能从真实来源查询数据
弱引用
java中使用weackreference来表示弱引用,如果某个对象与弱引用关联,那么当jvm在进行垃圾回收是,无论内存是否充足都会回收此类对象
weakreference<string> str = new weakreference<string>(new string("123")); system.out.println(str.get()); // 123 system.out.println(str.getclass()); // class java.lang.ref.weakreference //通知jvm进行内存回收 system.gc(); system.out.println(str.get()); //null
可以看出,被弱引用关联的对象,在调用垃圾回收以后就会被回收,
弱引用可以在回调函数在防止内存泄漏,因为回调函数芳芳是匿名内部类,一个非静态的内部类会隐式地持有外部类的一个强引用,当jvm在回收外部类的时候,此时回调函数在某个线程里被回调的时候,jvm就无法回收外部类,造成内存泄漏,
虚引用
java中使用phantomreference来表示虚引用,引用就好事虚设一样,就想某个对象没有引用关联一样,若某个对象与虚引用关联,那么任何时候都可能被虚拟机回收,虚引用不能单独使用,必须配合引用队列一起使用
phantomreference<string> ph = new phantomreference<string>("123", new referencequeue<string>()); system.out.println(ph.get()); // null
get方法没有获取到值,
当垃圾回收器准备回收一个对象时,如果发现它与虚引用关联.就会在他回收以前将这个虚引用加入到引用队列中,程序可以判断引用队列中是否加入了虚引用,来了解被引用的对象是否将要被回收,如果确实要被回收,就可以做一些回收之前的收尾工作