[转帖]java获取到heapdump文件后,如何快速分析?
https://www.jianshu.com/p/aaf56385766d

简介
在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警,没有触发OOM,但好在之前的复盘中总结了dump脚本,会在堆占用高时自动执行jstack与jmap,使得我们成功保留了问题现场。
查看堆占用分布
发现有heapdump文件后,我立马拷贝到本机,并使用MAT分析,如下:

很显然,好像是什么接口分配了非常大的String对象,一个String对象约200MB,那它是哪分配的呢?
查找大对象分配线程
这个分配行为肯定是某个线程做的,而线程是最常见的GC Root,因此只要查找对象的GC Root即可,如下:

找到了大对象对应的分配线程是http-nio-8088-exec-6,如下:

查看线程栈
如何查看这个线程在干什么呢?在MAT中摸索了一会,没找到相关内容,回想起我们的dump脚本中记录了jstack,打开看看,如下:

可以发现,这个线程正在做json序列化,但我仔细找了好一会,也没有找到相关接口的Controller,这是因为线程已经执行完了Controller里面的逻辑,之后返回接口响应数据时分配的大对象。
可是,线程栈中没有业务代码,就没法定位是哪个接口有问题了。。。
检查accesslog日志
考虑到分配大对象的接口肯定会很慢,于是我转向查看tomcat的accesslog日志,如下:

终于,找到了问题接口,这个接口是用来查询商品数据的,当输入3时会查询出所有3开头的商品,而这有20w+数据,解决问题很简单,加个limit完事。
排查过程复盘
然而,我一直有个习惯,就是解决一个问题后,我会反思一下问题解决过程中有多少运气成分。
如果你经常阅读排查问题类的技术文章,就会发现不少文章,中间突然有一步定位到了问题根因,可能是突然发现了一个线索,或是硬看代码看出来的,或是猜测某处有问题,我觉得这种排查过程都有不少运气成分,我希望问题是通过多年理论基础的积累和对诊断工具的熟练使用,而有章法的一步步查出来的。
而上面通过accesslog能够定位到问题,有一定的运气成分,因为本次内存问题不极端,如果此接口请求量大,那就会瞬间触发多次FGC,进而会影响其它接口也变慢,进而无法分辨出哪个是导致问题的接口!
我想,从理论上来说,Java堆文件里面,应该有线程栈以及线程栈上的参数,因为线程是对象,参数也是对象,它们理应都在堆里,于是我找了个空闲时间,又摸索起MAT这个工具了。
MAT查看线程栈
摸索了一会,我就发现有这样一个按钮,可以查看线程信息,如下:

找到前面说的线程http-nio-8088-exec-6,展开后,就可以发现线程栈以及栈上的参数,如下:

这就找到了请求的Request参数对象,再将Request对象多次展开后,就可以找到接口url信息,如下:

嗯,这样分析heapdump文件真tm的高效啊
MAT下载地址:https://www.eclipse.org/mat/downloads.php
VisualVM查看线程栈
考虑到不少同学习惯用VisualVM分析heapdump,这里也放一下VisualVM的使用方法。
首先,加载heapdump文件,如下:

然后选择相应对象,右键选择Select in Threads,如下:

定位到线程栈后,找到要查看的Request对象,点击进入,如下:

同样,展开Request对象后,可找到url信息,如下:

VisualVM下载地址:https://visualvm.github.io/download.html
总结
虽然我也用MAT很多次了,但每次问题都太简单,以至于没有深入使用过MAT,导致到现在才知道有如此便捷的分析路径。
[转帖]java获取到heapdump文件后,如何快速分析?的更多相关文章
- java获取到heapdump文件后,如何快速分析?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 简介 在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警 ...
- Java获取Web服务器文件
Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...
- spring java 获取webapp下文件路径
spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值
ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...
- java获取远程网络图片文件流、压缩保存到本地
1.获取远程网路的图片 /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ public static byte[] getImage ...
- Java 获取网络重定向文件的真实URL
其实Java 使用HttpURLConnection下载的的时候,会自动下载重定向后的文件,但是我们无法获知目标文件的真实文件名,文件类型,用下面的方法可以得到真实的URL,下面是一个YOUKU视频的 ...
- Java获取、删除文件和目录
package javatest; import java.io.File; import java.util.ArrayList; import java.util.regex.Pattern; c ...
- JAVA获取当前日期指定月份后(多少个月后)的日期
环境要求:使用jdk1.8 package com.date; import java.text.ParseException; import java.text.SimpleDateFormat; ...
- java获取src下文件
方式一: InputStream in = Test.class .getResourceAsStream("/env.properties"); URL url = Test.c ...
随机推荐
- 聊聊Llama2-Chinese中文大模型
转载请注明出处:https://www.cnblogs.com/zhiyong-ITNote 基本简述 Llama2-Chinese 大模型:由清华.交大以及浙大博士团队领衔开发:基于200B中文语料 ...
- curl使用小记(三)——获取远端数据到内存缓冲区
目录 1. 概述 2. 实现 3. 参考 1. 概述 我在博文<curl使用小记(二)--远程下载一张图片>中介绍了如何通过Curl获取远端的文件.不过在那个例子中,将获取远端数据与写入数 ...
- 华为云GaussDB城市沙龙活动走进安徽,助力金融行业数字化转型
本文分享自华为云社区<华为云GaussDB城市沙龙活动走进安徽,助力金融行业数字化转型>,作者: GaussDB 数据库 . 近日,华为云GaussDB数据库城市沙龙·安徽站圈层活动顺利举 ...
- 网络ping不通,试试这8招
摘要:网络ping不通,该怎么办?本文教你8个大招,轻松找到问题根源. 本文分享自华为云社区<网络ping不通,该怎么办?>,作者:wljslmz. 如下图,PC(192.168.10.1 ...
- GaussDB(DWS)运维 :遇到truncate执行慢,怎么办?
摘要:truncate执行慢,耗时长达几十到几百秒,这可怎么破? 本文分享自华为云社区<GaussDB(DWS)运维 -- truncate慢>,作者: 譡里个檔. [现象]truncat ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)迁移系列(上)
摘要:本期将详细介绍社区版Redis.kvrocks和Pika到GaussDB(for Redis)的迁移 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis)揭秘第十期 ...
- 详解JQuery框架的五大选择器
摘要:今天来和大家分享一下JQuery的五种选择器的详细使用方法. 本文分享自华为云社区<[JQuery框架]五大选择器"全家桶"详解!!!>,原文作者:灰小猿 . 今 ...
- ImproperlyConfigured('SQLite 3.8.3 or later is required Centos升级SQLite
遇到这个错误可以选择给django降级,不建议 这里选择升级SQLite 1.查看版本 sqlite3 --version 2.Centos7安装最新的sqlite3 wget https://www ...
- SQL SERVER 查询所有表 统计每张表的大小
(MySQL查看数据库表容量大小)[https://www.cnblogs.com/vipsoft/p/12145059.html] 查询某数据库中的所有数据表 SELECT name as tabl ...
- 通过 Homebrew 在 Mac OS X 上安装和配置 Redis
通过使用 Homebrew,可以大大降低在 Mac OS X 上设置和配置开发环境的成本. 让我们安装 Redis. $ brew install redis 安装后,我们将看到一些有关配置注意事项的 ...