使用MAT进行JVM内存分析实例

 更新时间:2023年04月26日 14:25:12   作者:@Kong  
这篇文章主要介绍了使用MAT进行JVM内存分析实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

背景描述

公司小程序商城项目,服务器为阿里云。

前段时间总是出现服务器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万个存活对象

分析线程栈信息,定位问题发生位置,并进行方法优化

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Springboot之Spring家族的技术体系

    Java Springboot之Spring家族的技术体系

    今天带大家来学习Spring家族的技术体系,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot3-WebClient配置与使用详解

    SpringBoot3-WebClient配置与使用详解

    WebClient是Spring 5引入的响应式Web客户端,用于执行HTTP请求,相比传统的RestTemplate,WebClient提供了非阻塞、响应式的方式来处理HTTP请求,是Spring推荐的新一代HTTP客户端工具,本文将详细介绍如何在SpringBoot 3.x中配置和使用WebClient,一起看看吧
    2024-12-12
  • 轻松掌握Java模板模式

    轻松掌握Java模板模式

    这篇文章主要帮助大家轻松掌握Java模板模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • java实现表格tr拖动的实例(分享)

    java实现表格tr拖动的实例(分享)

    下面小编就为大家分享一篇java实现表格tr拖动的实例。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • springboot整合ehcache和redis实现多级缓存实战案例

    springboot整合ehcache和redis实现多级缓存实战案例

    这篇文章主要介绍了springboot整合ehcache和redis实现多级缓存实战案例,从源码角度分析下多级缓存实现原理,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • Java实现图像分割功能

    Java实现图像分割功能

    这篇文章主要为大家详细介绍了Java实现图像分割功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • mybatis深入讲解resultMap的定义及用法

    mybatis深入讲解resultMap的定义及用法

    MyBatis的每一个查询映射的返回类型都是ResultMap,当我们提供返回类型属性是resultType时,MyBatis会自动给我们把对应值赋给resultType所指定对象的属性,当我们提供返回类型是resultMap时,将数据库中列数据复制到对象的相应属性上,可以用于复制查询,两者不能同时用
    2022-04-04
  • SpringData JPA快速上手之关联查询及JPQL语句书写详解

    SpringData JPA快速上手之关联查询及JPQL语句书写详解

    JPA都有SpringBoot的官方直接提供的starter,而Mybatis没有,直到SpringBoot 3才开始加入到官方模版中,这篇文章主要介绍了SpringData JPA快速上手,关联查询,JPQL语句书写的相关知识,感兴趣的朋友一起看看吧
    2023-09-09
  • SpringBoot异步处理的四种实现方式

    SpringBoot异步处理的四种实现方式

    本篇文章我们以SpringBoot中异步的使用(包括:异步调用和异步方法两个维度)来进行讲解,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • java重写(@Override)介绍以及举例说明

    java重写(@Override)介绍以及举例说明

    这篇文章主要给大家介绍了关于java重写(@Override)介绍以及举例说明的相关资料,在Java中@Override注解用于表示方法重写(覆盖)了父类的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01

最新评论