【Java引用规范】弱引用

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

上一期,对于强软引用我们已经有了一个认知了,这期介绍一下弱引用。

弱引用(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值