在上一期,对于强软引用我们已经有了一个认知了,这期介绍一下弱引用。
弱引用(Weak Reference)
概念和特性
我们在研究一个类的用处时,可以先看一下这个类上的注释,JDK上的注释对于该类的说明以及作用都会有着详细说明。
Weak reference objects, which do not prevent their referents from being made finalizable, finalized, and then reclaimed.
弱引用对象,这不会阻止它们的引用成为可终结的、结束的,之后被回收。
说人话就是弱引用与引用对象之间的关系相当于没有,不会让引用对象无法被垃圾处理器回收,只是一个定义而已。
弱引用其实在我们日常开发中也经常用到,那就是隐藏在ThreadLocal类中的Entry类。Entry继承了弱引用,并存放了在线程上下文都能访问的对象,以便在线程内共享变量。
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
插播一下广告,在使用ThreadLocal会有内存泄漏的风险,这一点在我的专栏《ThreadLocal详解》中会说到,大家可以去看一下😀。
创建和使用示例
Object object = new Object();
WeakReference<Object> weakReference = new WeakReference<>(object);
使用上面的代码就能创建一个弱引用的对象了。
弱引用对垃圾回收的影响
跟上期一样,从结果看本质,我们还是根据程序在内存中的变化来梳理出,弱引用在垃圾回收时,JVM到底做了啥,从而看出弱引用对垃圾回收的影响。
示例代码
使用程序代码与上期介绍软引用的类似,不过在每次循环中增加了转储内存快照的功能。
package com.zsk;
import com.sun.management.HotSpotDiagnosticMXBean;
import javax.management.MBeanServer;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.ref.WeakReference;
import java.text

本文介绍Java弱引用的概念、特性、创建和使用示例,重点分析其对垃圾回收的影响。通过示例代码运行产出的堆内存变化图、GC日志和内存快照,分析25 - 26秒和35 - 36秒两个时间段的内存变化,得出弱引用在不同内存情况的回收结论。

1179

被折叠的 条评论
为什么被折叠?



