JDK1.2之前只提供一种引用类型——强引用:Object obj = new Object(); 。而JDK1.2之后多出的三个选择分别是:html
强引用java
最经常使用的引用类型,如Object obj = new Object(); 。只要强引用存在则GC时则一定不被回收。缓存
软引用oracle
用于描述还有用但非必须的对象,当堆将发生OOM(Out Of Memory)时则会回收软引用所指向的内存空间,若回收后依然空间不足才会抛出 OOM 。通常用于实现内存敏感的高速缓存。htm
弱引用对象
发生GC时一定回收弱引用指向的内存空间。blog
虚引用生命周期
又称为幽灵引用或幻影引用,虚引用既不会影响对象的生命周期,也没法经过虚引用来获取对象实例,仅用于在发生GC时接收一个系统通知。内存
那么问题来了,若一个对象的引用类型有多个,如何判断它的可达性呢?其实规则以下:get
1. 单条引用链的可达性以最弱的一个引用类型来决定;
2. 多条引用链的可达性以最强的一个引用类型来决定;