四种引用 - 强引用、软引用、弱引用、虚引用

1. 强引用

强引用:被引用关联的对象永远不会被垃圾收集器回收

Object object=new Object();那object就是一个强引用了。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

public static void main(String[] args) {
        // 强引用
        UserEntity user1 = new UserEntity();
        UserEntity user2 = user1;
        user1 = null;
        System.out.println(user2);
        System.gc();
        System.out.println(user2);
}

2. 软引用

SoftReference() 内存不足时回收

软引用:软引用关联的对象,在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。

3. 弱引用

WeakReference() 垃圾回收时回收

无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。

public static void main(String[] args) {
        UserEntity user1 = new UserEntity();
        // 弱引用
        WeakReference weakReference = new WeakReference<>(user1);
        user1 = null;
        System.out.println(weakReference.get());
        System.gc();
        System.out.println(weakReference.get());
}

4. 虚引用

PhantomReference() 随时被回收

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

UserEntity user1 = new UserEntity();
ReferenceQueue referenceQueue = new ReferenceQueue<>();
PhantomReference phantomReference = new PhantomReference(user1, referenceQueue);
System.out.println(phantomReference.get()); 
  

引用队列

ReferenceQueue()

软弱虚对应引用的指针放入到引用队列中,实现清理。

你可能感兴趣的:(JVM)