背景
最近被问到了Java的四种引用类型,其实这个东西我之前有个概念,但是记得不是很清楚了。借着这个机会复习一下。
引用的概念
其实这个和Java的GC很相关,当虚拟机内存不足的时候发生GC,那么到底需要回收哪些对象呢?这里有很多GC算法,但是基本都逃不过一个基本的理念:计算对象的引用状况。比如引用计数,可达性分析等等,本质上都是在考察该对象是不是被其他对象引用。但是如果虚拟机发现现在所有的对象都是被引用的,那么这个时候该回收谁?为了区分这些对象呗引用的"强度",jdk在1.2之后,增加了三种其他类型的引用。
强引用
这个就是我们平时的赋值操作。
public class Main {
public static void main(String[] args) {
Object o=new Object();
}
}
比如这种,就是强引用。强引用的对象在gc分析它确实是存在被引用的时候,是不会被回收的。
软引用
这个一般描述为还有用,但是不是必须的对象,在gc的时候可以选择牺牲它来阻止OOM。其实很类似于缓存,在JVM内存充足的时候可以存活,在JVM内存即将耗尽时选择退出。
public class Main {
public static void main(String[] args) {
ReferenceQueue q=new ReferenceQueue();
Object obj=new Object();
SoftReference sr=new SoftReference(obj,q);
if(sr!=null){
obj=sr.get();
}
}
}
弱引用
用于描述比软引用更加“没用“的对象。在发生GC的时候,一定会被回收。
public class Main {
public static void main(String[] args) {
ReferenceQueue q=new ReferenceQueue();
Object obj=new Object();
WeakReference wk=new WeakReference(obj,q);
if(wk!=null){
obj=wk.get();
}
}
}
虚引用
这个看名字就发现问题了,它不能用于获取对象实例。GC时也会被直接回收。
基本就是这些了。其实貌似在项目代码里面没咋见过这些东西的使用。