返回

JVM内存管理中的引用与引用强弱关系

后端

JVM强软弱虚引用记录

在Java中,引用是变量对对象的一类关联。根据引用的强弱关系,可以分为四种不同的类型:强引用、软引用、弱引用和虚引用。这些引用类型对对象的生命周期和内存管理起着至关重要的作用。

强引用

强引用是最常见的引用类型,也是最简单的引用类型。当一个对象存在着强引用指向它时,该对象就不会被垃圾回收器回收。强引用是通过变量来实现的,例如:

Object obj = new Object();

当我们创建一个新的对象时,就会创建一个强引用来指向它。强引用是最强的引用类型,只要强引用存在,对象就不会被回收。

软引用

软引用是一种弱于强引用的引用类型。当一个对象存在着软引用指向它时,该对象可以被垃圾回收器回收,但前提是该对象没有被强引用指向。软引用通常用于缓存数据或临时对象。软引用可以通过java.lang.ref.SoftReference类来实现,例如:

SoftReference<Object> softRef = new SoftReference<>(obj);

当垃圾回收器回收对象时,它会首先检查对象是否有软引用指向它。如果有软引用指向它,则垃圾回收器不会立即回收该对象,而是将其放入引用队列中。当垃圾回收器再次运行时,它会检查引用队列中的对象。如果对象仍然存在软引用指向它,则垃圾回收器会将其从引用队列中移除,并将其回收。

弱引用

弱引用是一种比软引用更弱的引用类型。当一个对象存在着弱引用指向它时,该对象可以被垃圾回收器回收,无论该对象是否被强引用指向。弱引用通常用于缓存数据或临时对象。弱引用可以通过java.lang.ref.WeakReference类来实现,例如:

WeakReference<Object> weakRef = new WeakReference<>(obj);

当垃圾回收器回收对象时,它会首先检查对象是否有弱引用指向它。如果有弱引用指向它,则垃圾回收器会立即将其回收。

虚引用

虚引用是一种最弱的引用类型。当一个对象存在着虚引用指向它时,该对象可以被垃圾回收器回收,无论该对象是否被强引用、软引用或弱引用指向。虚引用通常用于跟踪对象的回收情况。虚引用可以通过java.lang.ref.PhantomReference类来实现,例如:

PhantomReference<Object> phantomRef = new PhantomReference<>(obj);

当垃圾回收器回收对象时,它会将该对象的虚引用添加到虚引用队列中。当垃圾回收器再次运行时,它会检查虚引用队列中的虚引用。如果虚引用指向的对象已经被回收,则垃圾回收器会将其从虚引用队列中移除。

总之,JVM中的四种引用级别分别是强引用、软引用、弱引用和虚引用。这些引用类型对对象的生命周期和内存管理起着至关重要的作用。强引用是最常见的引用类型,只要强引用存在,对象就不会被回收。软引用比强引用弱,当内存不足时,对象可以被回收。弱引用比软引用更弱,当内存不足时,对象可以被立即回收。虚引用是最弱的引用类型,无论内存是否不足,对象都可以被回收。