作者: 西魏陶渊明
博客: https://blog.springlearn.cn/
一、概念
1. 强引用
new 对象并指向引用变量的都是强引用,开发中大部分都是强引用。对于强引用,JVM宁愿报错OutOfMemoryError
错误,是程序异常终止,
也不会回收强引用来解决内存, 对这类情况,可以通过赋值强引用对象=null,从而被JVM回收。
但是一般我们在方法中定义的强引用,会存在方法栈中,当方法运行完,退出,此时方法中的强引用也会因为引用数为0,从而被回收。
2. 软引用
在内存充足情况下,GC不会回收软引用对象,如果内存空间不足了,才会回收这些对象的内存。也正因为这个特性,所以软引用经常用作缓存对象使用。
3. 弱引用
任意GC都会清理掉软引用对象,弱引用是最容易记的,任何的GC动作都会将弱引用对象给回收掉。
4. 虚引用
和其他三个不一样,这个不对生命周期,有影响,而是当要回收时候,加入到Queue队列中
二、在JDK中的体现
类 | 引用说明 | 用途 | 生存时间 | 被垃圾回收时间 |
---|---|---|---|---|
Object | 默认new出来的都是强引用 | 对象正常状态 | JVM停止或者无引用被回收 | 无任务对象使用 |
SoftReference | 软引用 | 常用作缓存 | 当内存不足时候终止 | 内存不足时候回收 |
WeakReference | 弱引用 | 常用作缓存 | 垃圾回收后终止 | 任何垃圾回收时 |
PhantomReference | 虚引用 | 用于跟踪对象是否被回收 | 垃圾回收后终止 | 任何垃圾回收时 |