首先我们需要了解一下JVM的垃圾回收机制
JVM会自动地分配和释放对象的内存。JVM使用垃圾回收器来识别和回收不再被程序使用的对象,以释放它们占用的内存空间。垃圾回收器周期性地扫描堆内存,找出哪些对象是不可达的,然后回收它们占用的内存。垃圾回收器使用可达性分析算法来判断对象是否可达。从根节点(例如局部变量或静态变量)开始遍历引用链,如果某个对象不可达,则认为它是垃圾,可以被回收。
不了解内存泄露和可达性算法的的可以查看我之前的博客内存泄漏是什么?发生在什么场景?如何解决?-CSDN博客
可达性分析算法是什么?用于什么场景?解决什么问题?-CSDN博客
强引用
强引用是最普遍的引用类型。当一个对象被强引用指向时,它就不会被垃圾回收器回收。即使内存不足,JVM也不会回收强引用指向的对象。
Object obj = new Object(); // obj是一个强引用
在这个例子中,只要obj
引用存在,Object
实例就不会被回收。如果没有其他引用指向这个对象,则它会被垃圾回收器回收。强引用的特点:
- 只要强引用存在,垃圾回收器就不会回收被引用的对象。
- 容易导致内存泄漏,尤其是在引用链较长的情况下。
- 适用于需要长期保持对象的场景,例如缓存、单例模式等。
软引用
软引用是一种相对于强引用的弱引用类型。当内存不足时,JVM会回收软引用指向的对象。软引用通常用于实现内存敏感的缓存。
SoftReference<Object> softRef = new SoftReference<>(new Object());
在这个例子中,如果内存不足,JVM会回收softRef
指向的对象,即使softRef
仍然存在。软引用的特点:
- 在内存不足时,软引用指向的对象会被回收。
- 适用于实现内存敏感的缓存,可以在内存不足时自动释放缓存。
- 可以通过
get()
方法检查软引用是否已经被回收。