zoukankan      html  css  js  c++  java
  • 强引用、软引用、弱引用、虚引用总结

    总结:
    强引用:普通new对象的引用
    User user = new User();
    jvm宁愿抛出OutOfMemory异常也不会去回收该对象
    软引用
    SoftReference引用的装饰的对象,该对象的强引用应该赋值空
    这里配合ReferenceQueue使用(也可以不配合),因为SoftReference本身也是new了一个对象
    当他把别人的问题解决掉以后,也需要把自己的问题解决,所以当jvm把软引用
    对象回收后,就会把自己的对象引用放到这个队列中,我们可以通过队列的poll()
    方法查看,如果存在该ReferenceQueue,那么就说明该对象的软引用对象已经被jvm
    回收,我们需要将该ReferenceQueue引用也赋值为空,等待被jvm回收。
    注意:软引用对象是在jvm内存不够的时候才会被回收,我们调用System.gc()方法只是
    起通知作用,jvm什么时候扫描回收对象是,是jvm自己的状态决定的。就算扫描到软引用
    对象也不一定会回收它。只有内存不够的时候才会回收

    ReferenceQueue queue = new ReferenceQueue();
    User user = new User();
    SoftReference ref=new SoftReference(user, queue);
    user=null;

    弱引用:弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,只要扫描到,
    无论内存是否充足(与软引用的区别),都会回收被弱引用关联的对象。在java中,
    用java.lang.ref.WeakReference类来表示
    WeakReference<User> sr = new WeakReference<User>(new User());
    System.out.println(sr.get());
    System.gc(); //通知JVM的gc进行垃圾回收
    System.out.println(sr.get());

    虚引用
    虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。
    在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,
    则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
    要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,
    如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。
    程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。
    如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
    ReferenceQueue queue = new ReferenceQueue();
    PhantomReference<User> pr = new PhantomReference<User>(new User(), queue);
    System.out.println(pr.get());

  • 相关阅读:
    Java动态绑定与多态
    Java中的equals,==,compareTo和compare的比较
    Java访问控制权限
    如何用eclipse进行jar文件打包?
    堆和栈的区别
    Java命名规则
    Java面向对象的基本概念
    java中length,length(),size()区别
    《剑指offer》第二十题:表示数值的字符串
    《剑指offer》第十九题:正则表达式匹配
  • 原文地址:https://www.cnblogs.com/KingIceMou/p/6966038.html
Copyright © 2011-2022 走看看