HashMap内存泄漏

HashMap内存泄漏


在看 ThreadLocal源码的时候,其中内部类 ThreadLocalMap的存储数据结构的内部类 Entry继承了 WeakReferenc,为了能够搞清楚这个 ThreadLocal,就只能先学习一下 WeakReferenc了。在了解了 WeakReferenc之后,又想到能不能使用强引用呢?,好吧又学习了一波在 Map中使用强引用的弊端。(好吧,有时候为了学习一个东西,不得不又去了解其他的一下内容,好家伙简直俄罗斯套娃)

言归正传,下面就来了解一下HashMap存在内存泄漏的原因。直接上代码

public class TestJava {
    public static void main(String[] args) {
        Map<MyClass, String> map = new HashMap<MyClass, String>();
        MyClass my1 = new MyClass();
        MyClass my2 = new MyClass();

        map.put(my1, "my1");
        map.put(my2, "my2");

        my1 = null;
        System.gc();
        System.out.println("第1步" + map);

        my2 = null;
        System.gc();
        System.out.println("第2步" + map);

        map.clear();
        System.gc();
        System.out.println("第3步" + map);
    }
}

class MyClass {
    private String msg = super.toString() + " 对象还在呢";

    @Override
    public String toString() {
        return msg;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println(super.toString() + " 对象被释放了");
    }
}

运行结果如下:
在这里插入图片描述
果然,在my1my2设置null之后GC没有回收这两个垃圾,这个跟Java中的HashMap默认是强引用是有关的
在这里插入图片描述
原因:其实HashMap存进去的是my1my2指向的地址(堆内存中两条红色的线)作为key,但进行my1=nullmy2=null的时候,本来按照常理来说,Java回收机制会对那些没有引用的堆内存对象进行回收,但不幸的是,HashMap依旧会强引用着my1my2的堆内存对象,导致GC无法对其进行回收。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值