MAT分析线上问题实战

  1. MAT下载
    1.1 下载
    地址: http://www.eclipse.org/mat/downloads.php
    在这里插入图片描述

注意:linux系统根据需求选择Linux (x86/GTK+)(32位)或者Linux (x86_64/GTK+)(64位).
1.2 安装
不用安装,把压缩包解压之后,可以直接执行
在这里插入图片描述
MemoryAnalyzer 这个文件可以双击执行.
1.3 配置
编辑文件MemoryAnalyzer.ini,根据需要调整堆的大小(dump文件越大,堆大小调整越大)

-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.700.v20180518-1200
-vmargs
-Xmx6144m
-Xms6144m
  1. 内存堆dump
    参照我的另一篇博客:
    https://blog.csdn.net/u014225427/article/details/72910758
    在这里插入图片描述
  2. dump文件导入MAT
    File->Open Heap Dump->选择dump文件
    第一次导入特别慢,后面再打开会快一些.如果1.3配置的堆内存不够,可能直接打不开.
  3. MAT分析步骤
    在这里插入图片描述

点击Reports下的Leak Suspects,做问题诊断.
在这里插入图片描述

诊断出来的问题是com.mysql.jdbc.JDBC4ResultSet 这个对象占据了46%的内存.其实通过其他途径也观察到线上jvm服务的内存100%了.
推测是从数据库捞数据到jvm中,捞的数据量太大,导致内存用满.那么该如何找到是哪行代码导致的这个问题呢.关键在于找到线程唯一标识,然后查看该线程的调用堆栈.

有的情况下, Problem Suspect 1就会显示是那个相关的线程.比如:
在这里插入图片描述
线程唯一标识就是这个 http-nio-8080-exec-39.

有的时候,这个地方不会显示线程标识,需要点击下方的Details查看
在这里插入图片描述
上图中的resin-port-8080-1903就是导致这个内存用满的线程标识.还有一种方法是通过占用最大的对象的 lists object来找最原始的线程引用
在这里插入图片描述

找到这个resin-port-8080-1903 线程标识后,打开thread_overview
在这里插入图片描述
在Name Regex列输入resin-port-8080-1903作为过滤,找到那个线程的调用堆栈
在这里插入图片描述
只剩下一个线程了,展开它:
在这里插入图片描述

基本上出现问题的代码都是最靠上面的第一个非框架类代码,找到那个调用,就可以定位到是哪个类的哪行代码导致的问题了.同时,展开每次调用,还能看到方法调用的参数,更方便定位问题.

  1. MAT核心功能
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值