mat查找多线程并发下大对象导致的堆内存问题

场景代码大概如下: 多线程并发请求接口,接口中的代码首先从guavacache.getIfAbsent()查找对象A,假设本地内存没有,代码又调用fetchFromRedisList获取数据,获取到数据后把对象A放到本地内存中 ps:对象A极大,占用大概有几十M

问题分析:首先这里有并发问题,多个线程会同时调用fetchFromRedisList方法并购造成对象A,而不是想象中的只有一个线程去获取,其他线程等待获取结果的guavacache.get(Loadable)模式,导致内存溢出

这里最重要的是怎么从mat分析的内存发现上面的问题的,从导出的堆内存看,每个线程对象下面都"关联"了一个大的A对象,而这个对象A其实并不是FastThreadLocal对象的成员变量,那这里的"关联"是怎么回事呢,其实打开mat的分析结果可以看到线程是通过[java local]的标志关联到对象A的,也就是说是通过方法入参或者方法局部变量关联的,这样就恍然大悟了。ps: mat内存分析中的[java local]标识指方法的入参或者局部变量, [local]标识指native本地方法的变量

附gc图在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值