原创

Java的四种引用

温馨提示:
本文最后更新于 2022年12月16日,已超过 873 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

Java的四种引用

强引用
如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。比如String str = "hello"这时候str就是一个强引用。

软引用
内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。
比如全局缓存 为了访问内存泄漏,可以使用软引用
SoftReference s = new SoftReference(o);

弱引用
如果一个对象具有弱引用,在垃圾回收时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。
WeakReference m = new WeakReference(o);

虚引用
如果一个对象具有虚引用,就相当于没有引用,在任何时候都有可能被回收。使用虚引用的目的就是为了得知对象被GC的时机,所以可以利用虚引用来进行销毁前的一些操作,比如说资源释放等。

GC、Reference与ReferenceQueue的交互



A、 GC无法删除存在强引用的对象的内存。


B、 GC发现一个只有软引用的对象内存,那么:
① SoftReference对象的referent 域被设置为null,从而使该对象不再引用heap对象。
② SoftReference引用过的heap对象被声明为finalizable。
③ 当 heap 对象的 finalize() 方法被运行而且该对象占用的内存被释放,SoftReference 对象就被添加到它的 ReferenceQueue(如果后者存在的话)。

C、 GC发现一个只有弱引用的对象内存,那么:
① WeakReference对象的referent域被设置为null,从而使该对象不再引用heap对象。
② WeakReference引用过的heap对象被声明为finalizable。
③ 当heap对象的finalize()方法被运行而且该对象占用的内存被释放时,WeakReference对象就被添加到它的ReferenceQueue(如果后者存在的话)。

D、 GC发现一个只有虚引用的对象内存,那么:
① PhantomReference引用过的heap对象被声明为finalizable。
② PhantomReference在堆对象被释放之前就被添加到它的ReferenceQueue

正文到此结束