前言
首先,请深刻理解引用计数法和可达性分析算法,详情请参阅点击打开链接。
HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活。如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。为了丰富的描述对象与对象之间的关系,更为了实现系统缓存的原因,Java建立了四种引用级别。
四种引用级别
在JDK1.2后,Java对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用和虚引用4种,这4种引用强度依次减弱。
引用类型 | 用途 | 被回收时间 | 生存时间 |
---|---|---|---|
强引用 | 对象的一般状态 | 从来不会 | JVM停止运行时终止 |
软引用 | 对象缓存 | 内存不足 | 内存不足时终止 |
弱引用 | 对象缓存 | 垃圾回收 | GC运行后终止 |
虚引用 | unknow | unknow | unkown |
最后,下面通过图来理解一下JVM回收机制究竟如何区别对待各种引用类型的:
参考文献:
《深入理解Java虚拟机——JVM高级特性与最佳实践》 第二版