使用MAT进行JVM内存分析实例
作者:@Kong 发布时间:2023-12-14 05:29:51
背景描述
公司小程序商城项目,服务器为阿里云。
前段时间总是出现服务器CPU报警现象(设置的阈值为95%,CPU使用率大于95%会自动报警)。
通过占用命令查看,迅速锁定当前运行的java进程。
基础知识
MAT简介
Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。
使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者。
Heap Dump
首先了解下Heap Dump,它也叫堆转储文件,是java进程在某个时间内的快照。
它在触发快照的时候保存了很多信息:java对象和类信息。
通常在写Heap Dump文件前会触发一次Full GC。
获取Dump
通过OOM获取,即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,可以在jvm里添加参数:
通过OOM获取,即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,可以在jvm里添加参数:
-XX:+HeapDumpOnOutOfMemoryError
主动获取,即在虚拟机添加参数如下,然后在Ctrl+Break组合键即可获取一份Heap Dump
-XX:+HeapDumpOnCtrlBreak
使用HPROF agent
使用Agent可以在程序执行结束时或受到SIGOUT信号时生成Dump文件。配置在虚拟机的参数如下:
-agentlib:hprof=heap=dump,format=b
jmap 可以在cmd里执行,命令如下:
jmap -dump:format=b file=<文件名XX.hprof>
使用JConsole
分析实战
首先获取dump,jmap -dump:format=b file=<文件名XX.hprof>
使用MAT工具进行日志解析,根据日志的大小不同,解析时间不同。File>Open Heap Dump。
日志分析。可以看出,存在两个较大的问题,每个大约占用1G的空间
查看Problem Suspect 1的详细信息、线程的树结构以及线程对象汇总,发现Member对象有近52万个存活对象
分析线程栈信息,定位问题发生位置,并进行方法优化
来源:https://blog.csdn.net/qq_33811736/article/details/109776121


猜你喜欢
- 一、什么是Spring?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架二、如何在程序中获取Spring配置的be
- 一、Lambda 表达式的基础语 * ambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操
- 一、Socket是什么Socket 的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。Socket 就像一个电话插
- 在android智能平板设备应用中,一项耗时的操作总要有个提示进度的框来提高用户的操作体验,操作进度提示框就显得很常用了。系统自带的有进度条
- Volley简介我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发
- 目录Profile用法resourcesfilters多环境配置解决方案Profile用法我们在application.yml中为jdbc.
- 有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下
- 第一步新建txt文件,写入内容我是放在D盘下的,数据以逗号隔开的,是英文逗号第二步读取数据在需要读取数据的页面,添加代码,就可以了 priv
- 刚开始我以为熔断和降级是一体的,以为他们必须配合使用; 只不过名字不一样而已,但是当我经过思考过后,发现他们其实不是一个东西;降级什么是服务
- 首先来看看以下程序将会打印出什么:class Dog { public static void bark
- 本文实例讲述了Android实现ListView数据动态加载的方法。分享给大家供大家参考,具体如下:list.setOnScrollList
- 一个请求从客户端发出到达服务器,然后被处理的整个过程其实是非常复杂的。本博客主要介绍请求到达服务器被核心组件DispatcherServle
- 1.垃圾收集算法的核心思想Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内
- 一、注解@PostConstruct使用注解@PostConstruct是最常见的一种方式,存在的问题是如果执行的方法耗时过长,会导致项目在
- 1.加入jackson的jar包2.在响应的方法上加上@ResponseBody:把java对象转化为json对象3.方法的返回值可以是对象
- Java Map.values()方法获取Map集合中的所有键值对象Java 集合类中的 Map.values() 方法用来获取
- 安全无处不在,趁着放假读了一下 Shiro 文档,并记录一下 Shiro 整合 Spring Boot 在数据库中根据角色控制访问权限简介A
- 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问
- 可以用于简单的过期订单取消支付、7天自动收货场景中1、Spring Boot整合redis 参考https://www.jb51.net/a
- weibo.java @Override &n