欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java四中引用

程序员文章站 2022-03-13 17:05:53
在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方法没有获取到值,
当垃圾回收器准备回收一个对象时,如果发现它与虚引用关联.就会在他回收以前将这个虚引用加入到引用队列中,程序可以判断引用队列中是否加入了虚引用,来了解被引用的对象是否将要被回收,如果确实要被回收,就可以做一些回收之前的收尾工作