引用

引用

什么是引用

在java中一切都被视为对象,我们的操作的标识符就是对对象的引用,类似一个指针,指向元素的地址

通过引用了可以操作对象

引用的四种类型

那么java中有4种引用,

强引用,软引用,弱引用,虚引用

强引用

我们常用的引用就是强引用。这是java默认声明的应用;

String a = "abc"

那么强引用是什么意思呢,就是只要a指向"abc",GC永远不会回收该对象。不然内存是否溢出。

此时可以通过a=null,手动置空来清除指向,GC回收"abc"对象

软引用

软引用是指 非必须但是有用的对象,也就是说,

如果内存足够,那么GC就不回收软引用对象,因为它有用,内存不够了,那么GC就回收软引用对象,因为它其实并不是必须的。

java当中怎么使用呢?

使用java.lang.ref.SoftReference类来表示软引用

这里通过JVM命令限定了内存 -Xms2M -Xmx3M初始内存2,最大3

 private static List 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];
            SoftReference sr = new SoftReference<>(buff);
            list.add(sr);
        }
        //垃圾回收
        System.gc();            
        for(int i=0; i < list.size(); i++){
            Object obj = ((SoftReference) list.get(i)).get();
            System.out.println(obj);
        }
    }
    
  
结果:
null
null
null
null
null
null
null
null
null
[B@49e4cb85

Process finished with exit code 0

 
 

系统内存不足的时候触发回收,所以前9个个对象直接被回收了,置null

弱引用

只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。

java.lang.ref.WeakReference 来表示弱引用。

private static void testWeakReference() {
        for (int i = 0; i < 10; i++) {
            byte[] buff = new byte[1024 * 1024];
            WeakReference sr = new WeakReference<>(buff);
            list.add(sr);
        }
        
        System.gc(); //主动通知垃圾回收
        
        for(int i=0; i < list.size(); i++){
            Object obj = ((WeakReference) list.get(i)).get();
            System.out.println(obj);
        }
    }

结果:
null
null
null
null
null
null
null
null
null
null

测试后发现不论内存够不够,只要触发了gc就全部回收

虚引用

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收

虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。

与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue

虚引用的主要作用是跟踪对象垃圾回收的状态。仅仅是提供了一种确保对象被finalize 以后,做某些事情的机制

//源码
public T get() {
        return null;
    }
 public PhantomReference(T referent, ReferenceQueue q) {
        super(referent, q);
    }
引用队列

引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。

各种引用的应用场景

  • 软引用与弱引用
    1. 保存那些可有可无的缓存数据,当内存不足时,缓存数据被回收(再通过备选方案查询),当内存充足时,也可以存在较长时间,起到加速的作用。如weakHashMap
  • 虚引用
    1. 虚引用主要用来跟踪对象的回收,清理被销毁对象的相关资源

你可能感兴趣的:(引用)