DOMinator

JVM 内存分析工具 MAT 的深度讲解与实践

自作多情 提交于 2020-12-30 20:44:43
1. 前言 熟练掌握 MAT 是 Java 高手的必备能力,但实践时大家往往需面对众多功能,眼花缭乱不知如何下手,小编也没有找到一篇完善的教学素材,所以整理本文帮大家系统掌握 MAT 分析工具。 本文详细讲解 MAT 众多内存分析工具功能,这些功能组合使用异常强大,熟练使用几乎可以解决所有的堆内存离线分析的问题。我们将功能划分为4类:内存分布详情、对象间依赖、对象状态详情、按条件检索。每大类有多个功能点,本文会逐一讲解各功能的场景及用法。此外,添加了原创或引用案例加强理解和掌握。 如图所示: 为减少对眼花缭乱的菜单的迷茫,可以通过下图先整体熟悉下各功能使用入口,后续都会讲到。 2. 内存分布详解及实战 2.1 全局信息概览 功能 :展现堆内存大小、对象数量、class 数量、class loader 数量、GC Root 数量、环境变量、线程概况等全局统计信息。 使用入口 :MAT 主界面 → Heap Dump Overview。 举例 :下面是对象数量、class loader 数量、GC Root 数量,可以看出 class loader 存在异常。 举例 :下图是线程概况,可以查看每个线程名、线程的 Retained Heap、daemon 属性等。 使用场景 全局概览呈现全局统计信息,重点查看整体是否有异常数据,所以有效信息有限,下面几种场景有一定帮助: 方法区溢出时

记一次线上服务器内存溢出排查

橙三吉。 提交于 2020-12-24 19:00:24
首先,这台服务器是我们的打印服务器,使用的是finereport7.0自带的webreport程序 背景是自从发布了一个供应商包装打印的功能后打印服务器经常内存溢出 首先在配置层面在系统启动时需要加上参数: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/yapp/gc_log/ 在奔溃时拿到java_pid27893.hprof文件 在eclipse中安装MAT工具,并打开该hprof文件 可以看到WebappClassLoader加载了3.9G的对象,点击Dominator Tree按钮查看最多占用内存的对象信息 发现在finereport服务器的程序上叫BaseUtils的类下有个map的空间特别大, 查看源码 public class BaseUtils { public static final String RESOURCE_ENCODER = "GBK"; private static Map imageMap = new HashMap(); public static BufferedImage readImageWithCache(String paramString) { return readImage(paramString, true); } private static BufferedImage

RocketMQ与Dubbo相爱相杀引起的FullGC

有些话、适合烂在心里 提交于 2020-12-07 06:46:28
在日常后端开发中,部分业务都是接收MQ消息,在消费消息的过程中,会调用外部的Dubbo接口,根据接口返回数据,做一些业务逻辑处理.如下图 上面会涉及两类线程,一类是MQ线程,一类是Dubbo线程. Dubbo接口调用超时也是经常会发生的事情,这篇文章中,我们模拟的情况是,让Dubbo接口调用超时,图中红线所示.然后一直向MQ消费者发送消息,我们观察线程和堆栈的变化. 仓库代码 https: //github.com/infuq/MQ-Dubbo-FullGC 如果需要运行上述代码,还需要部署Zookeeper和RocketMQ环境. 工程结构如下图 Dubbo提供者的接口超时时间设置的是5s.如下图 而在提供者的实现方法中,让线程睡眠20秒,从而达到调用者调用接口超时目的.如下图 接下来按顺序启动它们 首先启动Dubbo提供者(DubboProvider类). 接着启动MQConsumer, 同时需要给它配置VM启动参数 -Xms90M -Xmx90M -XX :+PrintGCDetails 最后启动MQProducer, 它会一直发送消息. 所有的都启动完成之后, 借助JDK自带的jvisualvm.exe工具观察MQConsumer的堆栈信息. 观察MQConsumer的堆栈信息,会发现老年代会一直增长,当老年代快增长到顶端时,手动dump堆栈信息,用于接下来分析堆的情况.

记一次通过Memory Analyzer分析内存泄漏的解决过程

跟風遠走 提交于 2020-07-29 06:30:00
状况描述: 最近项目新打的版本,过不了多长时间,项目就会挂掉。状况就是处于一种假死的状态。索引查询都很慢,几乎进行不了任何操作,慢慢卡死。 然后我们再发版时,只能基于之前打好的war包,替换或者增加class文件。 情况对比及分析: 由于之前代码做过一次大整顿,提交的代码比较多,所以通过回滚版本的方式解决,比较困难。一是因为整顿的成果不能白白抹杀;二是那么多文件,靠人工挨个对比查找,比较困难。 解决方案一: 之前, 一直对目前项目的打包方式心存质疑,所以这次发生问题时,我首先怀疑的对象是Jenkins和生产的Tomcat服务器。我通过堡垒机连接到生产时,发现通过Jenkins启动应用程序,会启动两个两个tomcat进程。 然后,这似乎更加坚定了我的看法,马上就找到了运维,但是经确认后,是没有问题的。一个是用root用户启动的,一个是用tomcat用户启动的。一个守护进程,一个应用进程。 解决方案二: 排除了服务器的问题,开始正面考虑程序的问题。 重新发项目有问题的版本,Dump下来的日志,然后迅速回滚观察。单台机器的dump日志有5个G: 通过Memory Analyzer分析,在Leak Supects Report 视图中,有如下分析结果: 上图所示,共有三类问题a、b、c;还有一些其他的,类型为d。 先来看第一个问题(后来发现,前几个问题都是同一个问题)

jvm内存溢出性能调优

 ̄綄美尐妖づ 提交于 2020-02-29 01:05:14
常用工具及命令 jps jstat Top jstack jmap mat工具 top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid jps:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称及进程pid 如:jps -l pid Jstack命令 jstack是java虚拟机自带的一种堆栈跟踪工具。用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程的几种状态: NEW:未启动的。不会出现在Dump中。 RUNNABLE:在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。 BLOCKED:受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。 WATING:无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。 TIMED_WATING:有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。 TERMINATED:已退出的。 例一: public

总结:JVM调优之MAT

故事扮演 提交于 2019-12-04 13:22:47
一、MAT导入堆内存dump文件 二、描述 Histogram可以列出内存中的对象,对象的个数以及大小。 Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。 Top consumers通过图形列出最大的object。 Leak Suspects通过MA自动分析泄漏的原因。 三、重点关心:Top consumers之 按包名看占用 ,根据包我们知道哪些公共用的到jar或自己的包占用 如下红框是自己的代码类占用情况,重点优化类 来源: https://my.oschina.net/weiweiblog/blog/3129926

MAT使用-jvm内存溢出问题分析定位

…衆ロ難τιáo~ 提交于 2019-12-03 11:40:45
1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。 2.什么时候会用到MAT? a)OutOfMemoryError的时候,触发full gc,但空间却回收不了,引发内存泄露 b)java服务器系统异常,比如load飙高,io异常,或者线程死锁等,都可能通过分析堆中的内存对象来定位原因 3.MAT安装: https://www.eclipse.org/mat/downloads.php --下载地址 http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html --官网使用教程 #参数配置: 分析堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,建议分配给 MAT 尽可能多的内存资源。两种方式分配内存资源给 MAT: 1)修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx4g 2)编辑文件 MemoryAnalyzer.ini 添加 -vmargs – Xmx4g 4.MAT分析dump堆栈: #4.1dump文件生成: a

MAT使用-jvm内存溢出问题分析定位

烈酒焚心 提交于 2019-11-30 06:35:35
1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。 2.什么时候会用到MAT? a)OutOfMemoryError的时候,触发full gc,但空间却回收不了,引发内存泄露 b)java服务器系统异常,比如load飙高,io异常,或者线程死锁等,都可能通过分析堆中的内存对象来定位原因 3.MAT安装: https://www.eclipse.org/mat/downloads.php --下载地址 http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html --官网使用教程 #参数配置: 分析堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,建议分配给 MAT 尽可能多的内存资源。两种方式分配内存资源给 MAT: 1)修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx4g 2)编辑文件 MemoryAnalyzer.ini 添加 -vmargs – Xmx4g 4.MAT分析dump堆栈: #4.1dump文件生成: a

总结:JVM调优之MAT

折月煮酒 提交于 2019-11-26 09:57:48
一、MAT导入堆内存dump文件 二、描述 Histogram可以列出内存中的对象,对象的个数以及大小。 Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。 Top consumers通过图形列出最大的object。 Leak Suspects通过MA自动分析泄漏的原因。 三、重点关心:Top consumers之 按包名看占用 ,根据包我们知道哪些公共用的到jar或自己的包占用 如下红框是自己的代码类占用情况,重点优化类 来源: oschina 链接: https://my.oschina.net/weiweiblog/blog/3129926