MAT分析线上问题实战

  1. MAT下载
    1.1 下载
    地址: http://www.eclipse.org/mat/downloads.php
    MAT分析线上问题实战_第1张图片

注意:linux系统根据需求选择Linux (x86/GTK+)(32位)或者Linux (x86_64/GTK+)(64位).
1.2 安装
不用安装,把压缩包解压之后,可以直接执行
MAT分析线上问题实战_第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
    MAT分析线上问题实战_第3张图片
  2. dump文件导入MAT
    File->Open Heap Dump->选择dump文件
    第一次导入特别慢,后面再打开会快一些.如果1.3配置的堆内存不够,可能直接打不开.
  3. MAT分析步骤
    MAT分析线上问题实战_第4张图片

点击Reports下的Leak Suspects,做问题诊断.
MAT分析线上问题实战_第5张图片

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

有的情况下, Problem Suspect 1就会显示是那个相关的线程.比如:
MAT分析线上问题实战_第6张图片
线程唯一标识就是这个 http-nio-8080-exec-39.

有的时候,这个地方不会显示线程标识,需要点击下方的Details查看
MAT分析线上问题实战_第7张图片
上图中的resin-port-8080-1903就是导致这个内存用满的线程标识.还有一种方法是通过占用最大的对象的 lists object来找最原始的线程引用
MAT分析线上问题实战_第8张图片

找到这个resin-port-8080-1903 线程标识后,打开thread_overview
MAT分析线上问题实战_第9张图片
在Name Regex列输入resin-port-8080-1903作为过滤,找到那个线程的调用堆栈
在这里插入图片描述
只剩下一个线程了,展开它:
MAT分析线上问题实战_第10张图片

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

  1. MAT核心功能

你可能感兴趣的:(Java)