JVM jmap dump 分析dump文件 / 如何使用Eclipse MemoryAnalyzer MAT 排查线上问题
jhat简介
jhat用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言
这个工具并不是想用于应用系统中而是用于"离线"分析。
把本机的java内存映像导出到heap.dmp中,其中PID为java进程的ID号。
jmap -dump:live,format=b,file=heap.dmp PID
导出后的映像文件可以用jhat来进行分析,-J是向java虚拟机传一个参数,如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大,你要指定一个很大的值,否则在分析过程中就会有OutOfMemeryError的错误。
jhat heap.dmp
如果报oom,可以通过参数-J-xmx768m 指定最大使用堆,例如:
jhat -J-xmx768m -port <端口号:默认为7000> heap.dmp
xxx@dev05:/data/logs/odin$ jhat -J-mx768m -port 7000 dump.log
Reading from dump.log ...
Dump file created Thu Aug 30 14:26:51 CST 2018
Snapshot read, resolving...
Resolving 1046604 objects...
Chasing references, expect 209 dots.................................................................................................................................................................................................................
Eliminating duplicate references.................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
不过还是Eclipse MemoryAnalyzer MAT好用的多, 他有方法栈调用关系,各个对象占用heap的大小,方便排查问题。
首先介绍几个概念
所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size.
这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。
Shallow Size
对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。
Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。



如上图,功能不多做介绍,大家可以自己点一点,玩一下,我主要说排查问题的步骤及方式

1. 点击file-> open dump file 来导入我们jmap dump 下来的堆栈信息文件
2. 点击 top consumers-> 然后就会看到各种对象占用的大小,找到我们怀疑较大的对象(全类名)
3. 左键点击List objects -> incoming 显示方法栈调用关系
基本就能看出来是代码哪里出现内存泄露或代码哪里对象没有释放。
比如线上的一个例子,有个AppendFile 对象有14w个之多,占了1.6G内存,full gc 无法回收。导致线上响应卡顿。
接下来就是自己调试代码,解决相关问题了。后面我会上一些截图方便大家参考。
JVM jmap dump 分析dump文件 / 如何使用Eclipse MemoryAnalyzer MAT 排查线上问题的更多相关文章
- 使用Dump转储文件排查线上环境服务未知问题
利用Dump转储文件获取正式环境程序堆栈状态 服务异常找不到原因时,我们通常通过重新启动服务来尝试解决问题,但是在决定重启之前,请不要立刻重启Windows服务或站点 重启服务会让当前案发现场的内存证 ...
- 利用JVM在线调试工具排查线上问题
在生产上我们经常会碰到一些不好排查的问题,例如线程安全问题,用最简单的threaddump或者heapdump不好查到问题原因.为了排查这些问题,有时我们会临时加一些日志,比如在一些关键的函数里打印出 ...
- 更改Eclipse下Tomcat的部署目录 ,防止上传的文件是到eclipse的克隆的tomcat上的webapp,而不是tomcat本身的webapp
使用eclipse开发是因为机器不够用myeclipse,eclipse也比myeclipse清爽很多,启动速度也快.这里的搭建开发环境使用: Jdk1.6+Tomcat6+Eclipse JEE, ...
- JVM 线上故障排查基本操作
# 前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的.各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该 ...
- Java线上问题排查思路及Linux常用问题分析命令学习
前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...
- JVM 线上故障排查基本操作 (转)
前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的.各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该如何 ...
- Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了J ...
- 使用JMAP dump及分析dump文件
查看整个JVM内存状态 jmap -heap [pid]要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况jmap -his ...
- [Java基础] 使用JMAP dump及分析dump文件
转载:http://blog.csdn.net/kevin_luan/article/details/8447896 http://liulinxia02.blog.163.com/blog/stat ...
随机推荐
- PrintWriter中的write与println方法居然就是这些区别
为什么循环中分别用write方法和println方法效果一样呢? import java.io.*; public class WriteLog { private BufferedReader bf ...
- 黄聪:JQUERY的datatables插件,Date range filter时间段筛选功能
需配合moment插件实现:http://momentjs.com/ 演示:http://live.datatables.net/zuciyawi/1/edit HTML代码 <!DOCTYPE ...
- android 退出程序解决内存释放so的问题
做Android程序的时候发现一个问题,由于用到了so库,当应用程序退出了,但是手机变得很卡,点击"设置"查看应用程序,界面显示着可以点击"强制关闭". 由于这 ...
- 【Centos7裁剪】
#!/bin/sh rootdir=`pwd` rm -rf ${rootdir}/centos* KERNEL_DIR=${rootdir}/kernel ROOTFS_DIR=${rootdir} ...
- 轻松快速实现MySql数据向SQLServer数据转移
转移数据的方式其实园子里各位亲友已经写过不少了,这里挑一种常用的ODBC数据转移,主要是把每个步骤尽可能完善讲到,下次直接按文章从头到尾看一遍,可以在最短时间完成数据转移. 这里用到的工具有MYSQL ...
- JS中模态窗口(showModalDialog)的详细使用
基本介绍: showModalDialog() (IE + 支持) showModelessDialog() (IE + 支持) window.showModalDialog() 方法用来创建一个显示 ...
- spring4.0之九:websocket简单应用
Spring 4.0的一个最大更新是增加了websocket的支持.websocket提供了一个在web应用中的高效.双向的通讯,需要考虑到客户端(浏览器)和服务器之间的高频和低延时消息交换.一般的应 ...
- jQuery版本问题,及事件源
jQuery版本的分界线是2.0 2.0之前很多方法支持ie低版本,2.0之后就不支持了 工具:index() 指定元素的索引 (有参数) 不传参的情况下,父级元素下同级元素的排名,传参:指定元素的 ...
- 项目中自己一直用到的baseAdapter的类
import java.util.LinkedList; import java.util.List; import android.content.Context; import android.v ...
- centos7开启端口(永久--permanent)
1.运行命令:firewall-cmd --get-active-zones运行完成之后,可以看到zone名称,如下: 2.执行如下命令命令: firewall-cmd --zone=public - ...