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中,就运用了虚引用管理堆外内存。
网友评论