MAT工具分析应用内存泄漏以及定位问题代码

一、开发环境:

linux 3.10.0-327.el7.x86_64

weblgoic:10.3.6

应用环境JDK版本:java version "1.6.0_45"

本地主机JDK版本:java version "1.8.0_211"

MAT版本:Eclipse Memory Analyzer Version 1.8.0

注:MAT1.8需要1.7及以上版本JDK。

二、内存泄漏分析过程以及代码定位

1、通过主机内存监控,发现主机内存在不断增加,重启后依旧会出现同样的问题。

2、查看JVM监控,发现Old Gen内存使用使用率在不断上升,可以看到在GC时段存在内存回收,但是总体趋势上升。

3、GC时间和次数也在不断上升

出现这种情况,一般都是出现了内存泄漏,这种泄漏情况也是比较难判断。

4、登录主机,查看各存活类名、对象数量和对象占用内存大小:

# jmap -histo:live 4762 | head -20

该com.xxxx.rmw.model.rmclass.pojo.ResClassIndexObj对象占用内存如此多,很有可能与该代码有关。

5、立马做了一个线程Dump

# jmap -dump:format=b,file=476220190829.bin 4762

使用MAT工具打开获得如下分析结果:

点击"LeakSuspects".

此处给出了3个可疑问题。

com.xxxx.common.util.ResDelagateObj是开发商的代码

点击"Details >"

找到‏‎‬‫‍‮‍‮‎‍⁠‌‪‏‎‬‫‍‮‍‮‎‍⁠‌‪"Shortest Paths To the Accumulation Point‫‬‌‏"​‎‍‎‮‫‬‌‏‫​​‎‍‎‮‏‎‬‫‍‮‍‮‎‍⁠‌‪‫‬‌‏‫​​‎‍‎‮

蓝色部分便是工具分析出来可能存在问题部分,点击蓝色部分,选择Java Basics > Thread Details

这里我们可以看到详细的线程堆栈信息:

在之前的界面,点击Java Basics > Thread Overview and Stacks

展开后,这里我们可以看到问题对象有关的代码调用。

记住这个

at com.xxxx.rga.querymaintain.services.QueryMaintainService.executeQueryByTransSql

接着回到线程堆栈中我们找到有关的代码信息:

这里引起内存泄漏的调用代码。

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值