Java中的四种引用

2020-11-04  本文已影响0人  Drew_MyINTYRE

Java中的四种引用

public class Student {    @Override
    protected void finalize() throws Throwable {
        System.out.println("Student 被回收了");
    }
}

public static void main(String[] args) {
    Student student = new Student();
    student = null;
    System.gc();
}

打印结果:Student 被回收了

在实际开发中,千万不要重写finalize方法 !!!!

看到有一些对象被手动赋值为NULL,就是为了可以提醒JVM,这块资源可以进行回收了。

 SoftReference<Student>studentSoftReference=new SoftReference<Student>(new Student());

 Student student = studentSoftReference.get();

软引用有什么特点呢?

当内存不足,会触发JVM的GC,如果GC后,内存还是不足,就会把软引用包裹的对象给干掉。

//定义了一个软引用对象,里面包裹了byte[],byte[]占用了10M,然后又创建了10Mbyte[]
//手动完成GC后,软引用对象包裹的byte[]还活的好好的,
//但是当我们创建了一个10M的byte[]后,最大堆内存不够了
//所以把软引用对象包裹的byte[]给干掉了,如果不干掉,就会抛出OOM。
SoftReference<byte[]> softReference = new SoftReference<byte[]>(new byte[1024*1024*10]);
System.out.println(softReference.get());
System.gc();
System.out.println(softReference.get());        
byte[] bytes = new byte[1024 * 1024 * 10];
System.out.println(softReference.get());

打印结果:
[B@11d7fff
[B@11d7fff
null

软引用到底有什么用呢?

比较适合用作缓存,当内存足够,可以正常的拿到缓存,当内存不够,就会先干掉缓存,不至于马上抛出OOM。

弱引用在很多地方都有用到,比如ThreadLocal、WeakHashMap。

//弱引用的特点是不管内存是否足够,只要发生GC,都会被回收
WeakReference<byte[]> weakReference = new WeakReference<byte[]>(new byte[1]);
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());

打印结果:
[B@11d7fffnull
null
//虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,
//当发生GC,虚引用就会被回收,并且会把回收的通知放到ReferenceQueue中。
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<byte[]> reference = new PhantomReference<byte[]>(new byte[1], queue);
System.out.println(reference.get()); //null

//这就是虚引用特点之一了:无法通过虚引用来获取对一个对象的真实引用
public T get() {        
  return null;
}

虚引用有什么用呢?在NIO中,就运用了虚引用管理堆外内存。

上一篇 下一篇

猜你喜欢

热点阅读