模拟jvm内存溢出并使用mat分析原因

如何通过MAT分析内存溢出的问题 1.使用 Memory Analyzer Tools 获取堆存储,点击Open Heap Dump,选择上面运行获取的错误信息文件(工具分析的时候会在dump文件所在的文件夹中生成其他文件,最好是将dump文件单独放到一个空文件夹中)注意:如果dump过大打不开,因为服务器上一般出问题的dump都会好几个G,这是MAT的运行内存不足没办法分析过大的dump,所以就要修改MAT运行参数。具体看你分析的dump有多大,来修改运行内存,因为我分析的dump将近7个G,所以就设置了8000m。 阅读详情

由于我们在生产环境中不能随意打印log日志,也不能随意更新代码重启生产环境的服务,所以当生产环境发生内存溢出时我们应该采取什么措施来找出问题所在尼?

一、模拟内存溢出

@RestController
public class MemoryController {
    private List<User> userList = new ArrayList<User>();
 
    /**
     * -Xmx32M -Xms32M
     * @return
     */
    @GetMapping("/heap")
    public String heap(){
        int i = 0;
        while (true){
            userList.add(new User(i++, UUID.randomUUID().toString()));
        }
    }
}

注释:请求http://localhost:8080/heap,不断往userList中添加User对象,由于userList是MemoryController的属性不会被回收,故导致内存溢出。
在启动时配置jvm参数:-Xmx32M -Xms32M (使得程序尽快能够内存溢出,不用等待很长时间)

二、生成heap dump文件

我们选择以下任意一种方式来获取一份heap dump文件:

1.自动生成

运行前添加jvm参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
当内存溢出时会在当前目录下自动生成heap dump文件

2.手动执行

当发生内存溢出时在控制台手动输入命令: 
jmap -dump:format=b,file=heap.hprof 4063
其中4063为java程序运行的pid,运行命令后会在执行目录下生成heap.hprof文件

三、使用mat工具分析

下载mat(下载地址),下载mac版本,双击运行。
选择我们上面模拟生成的heap dump文件,加载完成后。
首页:
32EEAD9F-7B01-49CA-9ABF-4F9FD4530080.png
点击Leak Suspects查看可能产生泄露的原因:
CE3B40A4-89E6-4EA5-ADA9-914BF3BC6EA3.png

首先怀疑的是MemoryController这个类总共占用了62.26%的内容

点击标题栏第二个按钮,输入包名正则,查看对象在内存中的数量

0FB2950E-DC9D-47DC-86AB-D9E2AA1966B6.png

我们可以看到产生了110476个User对象,可以看出这明显是不正常的现象
下面查看该对象的强引用

D0C498BA-6608-45C2-81FA-26CF44D001A2.png

可以看出MemoryController对象的userList属性中存在110476个User对象,于是我们就找到了内存泄露的真正原因了。

B807622A-A8D5-4578-873C-9921F129B84F.png

我们还可以从对象占用内存比例来查找原因,点击标题栏第三个图标,输入包名正则表达式,可以看到按照内存占用的排序结果,这也同样反应了问题所在

FA7E61FF-0C21-4320-BF18-47BA4219E649.png

内存分析工具JProfiler 内存分析 JProfiler 阅读详情

相关推荐

JVM系列之:MAT工具使用教程

本文为《深入学习 JVM 系列》第二十三篇文章 Eclipse Memory Analyzer (MAT)是一个快速且功能丰富的Java堆分析器,可帮助您发现内存泄漏并减少内存消耗。 安装并启动 直接参考 Mac下MAT的安装 需要注意的是注意 JDK 版本和 MAT 版本的映射,最新的 MAT 版本为 1.12.0,需要在 JDK11 以上运行。 如果 JDK 版本为 11,且 MAT 版本是最新的,还需要修改 /Applications/mat.app/Contents/Eclipse/Memor.

Herishwater的博客 1万+

JVM图形化工具之Visual VM的简单使用

性能监控:找到占用CPU时间最长的方法 分析堆dump

不见长安见晨雾 390

PX4 EKF2协方差矩阵‘负定’了怎么办?保姆级排查与数值稳定性修复指南

本文深入解析PX4 EKF2协方差矩阵出现‘负定’问题的原因,并提供全面的排查与修复方案。从理论分析到实践操作,详细介绍了数值稳定性危机的诊断工具、算法加固措施及工程实践中的防御性编程技巧,帮助飞控工程师有效解决滤波算法中的数值稳定性问题。

weixin_28730927的博客 319

MAT在内存分析中的简单使用

在Android开发过程中,经常会遇到各种内存泄漏和内存溢出的问题,所谓的内存泄漏是指部分已经不再使用的变量还继续占用内存得不到及时释放,而内存溢出则是指Android虚拟机会给每个应用(对应一个进程)可分配的内存是有限的,当该应用占用的内存达到可分配的最大内存时,应用继续申请内存,这是就会出现内存溢出。内存溢出多是内存泄漏导致的,内存泄漏和内存溢出都会降低应用运行效率,导致应用卡顿,所以在日常开...

Yoryky的专栏 1252

保姆级教程:用PyBullet在Windows/Mac上快速搭建你的第一个机器人仿真环境(附避坑指南)

本教程详细介绍了如何使用PyBullet在Windows和Mac上快速搭建机器人仿真环境,包括Python环境配置、依赖安装避坑指南、首个机械臂仿真实现及性能优化技巧。通过分步指导和实战代码,帮助初学者轻松入门机器人仿真技术。

weixin_42526087的博客 407

【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection

文章目录摘要1. Introduction 摘要 motivations: 基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。 contributions: 提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。 experiments: 在BSDS500

轻舟的万重重山 1万+

容易发生内存泄漏的八个场景,你都知道吗?

这篇文章介绍内存泄漏与内存溢出的区别,并从生命周期变长、不关闭资源、改变哈希值、缓存等多方面举例内存泄漏的场景内存泄漏是指当对象不再使用,但是GC无法回收该对象内存溢出是指当大量对象内存泄漏,没有资源再给新对象分配静态集合、饿汉单例、不合理的设置变量作用域都会使对象生命周期变长,从而导致内存泄漏非静态内部对象有隐式指向外部对象的指针、使用集合不删除元素等都会隐式导致内存泄漏忘记关闭资源导致内存泄漏(try-with-resource自动关闭解决)

m0_71777195的博客 750

从string一词感受从字母象形到语义生成的底层逻辑

从词源上看,个人认为,soft一词的含义主要来自于“柔软水滑或柔软光滑”这样的含义,是从这样的含义中逐渐窄化,最终主要用来指“柔软”之意,而光滑、水滑这样的含义或语义形象最终被淡化,所以,soft如果符合首字母象形原则,那么它主要的来源形象,应当是【水】,也就是说,soft一词和smooth(a.光滑的)、ski(滑雪)/skate(滑冰)、slip(滑倒)/slippers(拖鞋)、slide(滑动)是相通的,并最终和sea(海)、sweat(汗/汗水)这一类和水一直相关的单词也相通。

nshkfhwr的博客 1269

Java:如何模拟内存溢出和内存泄露

举个例子,如果你的程序需要1GB的内存,但你的系统只有512MB的内存可用,此时程序就会发生内存溢出。但是,如果有一个持续增长的列表或其他集合,并且程序没有释放对其中对象的引用,那么就会导致内存使用效率低下,可能在一段时间后因为占用过多内存而引发性能问题或内存溢出错误。这意味着随着时间的推移,这个列表会持续增长,占用更多的内存,从而模拟内存泄露。内存溢出(Out Of Memory,OOM)和内存泄露(Memory Leak)都与计算机内存的管理有关,但它们是不同的概念。,或者使用适当的集合类如。

好幸运 1266

技术指南| 叶绿体基因组高级分析全流程解析

本文详细解析了叶绿体基因组高级分析的全流程,包括实验设计、序列组装与注释、比较基因组分析、选择压力与功能进化等关键步骤。通过实战案例和技术技巧,帮助研究者掌握叶绿体基因组分析的核心方法,提升植物进化研究和系统学分析的效率与准确性。

weixin_33725239的博客 491

GJB软件需求规格说明-编制指南

《软件需求规格说明》是软件开发过程必不可少的文档,并且需要评审,也是后续鉴定试验的依据,因此,非常有必要认真对待此文档。 文档对于很多开发技术人员来说是一件非常头疼的事,虽然标准有要求,但是光看标准还是难以下笔。 本文将详细讲解如何按照GJB 438C的要求编写《软件需求规格说明》。 注:文中有背景颜色内容为标准内容,加粗部分为范例。斜体部分为解释。 全文1.3万字

Abel的博客 6357

Java jvm 内存溢出分析

总结最后到时HeapControler中的hashMap导致的内存溢出。

zy08403的专栏 689

Windows 上 openclaw onboard --install-daemon 命令的安装位置和启动配置

摘要:Windows系统中,执行openclaw-cnonboard--install-daemon命令会创建计划任务OpenClawGateway,该任务在用户登录时自动运行位于%USERPROFILE%.openclaw\gateway.cmd的脚本文件来启动服务。管理方法包括通过任务计划程序或命令行(schtasks)查看/启停任务,使用openclaw gateway命令操作服务,或通过删除计划任务和脚本文件完全卸载服务。该机制确保OpenClawGateway服务随系统登录自动启动。(149字)

大坡3D软件开发 1375

java 虚拟机oom 参数配置,本地模拟内存溢出并分析Dump文件,

本地模拟内存溢出并分析Dump文件,java Dump文件分析前言dump文件是java虚拟机内存在某一时间点的快照文件,一般是.hprof文件,下面自己模拟一下本地内存溢出,生成dump文件,然后通过mat工具分析的过程。配置虚拟机参数要想本地模拟oom异常,那么建议将堆内存设置的小一点,那样容易触发-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath...

weixin_42519514的博客 508

华为od统一考试B卷【宜居星球改造计划】Java&Go 实现

XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件,由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式,假设将火星待改造的区域为row * column的网格每个网格有3个值,宜居区、可改造区、死亡区,使用YES、NO、NA代替,YES表示该网格已经完成大气改造,NO表示该网格未进行改造,后期可进行改造,NA表示死亡区,不作为判断是否改造完成的宜居,无法穿过 初始化下,该区域可能存在多个宜居区,并且每个宜居区能同时在每个太阳日单位向上下左右四个方向的相邻格子进

MISAYAONE的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java oom dump_本地模拟内存溢出并分析Dump文件

java Dump文件分析前言dump文件是java虚拟机内存在某一时间点的快照文件,一般是.hprof文件,下面自己模拟一下本地内存溢出,生成dump文件,然后通过mat工具分析的过程。配置虚拟机参数要想本地模拟oom异常,那么建议将堆内存设置的小一点,那样容易触发-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录} -Xms20m -Xm...

weixin_36071315的博客 1385

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Jvm之堆内存溢出和非堆内存溢出

jVM标准参数 -help -server -client -version -showversion -cp -classpath X参数 非标准化参数 -Xint:解释执行 -Xcomp:第一次使用就编译成本地代码 -Xmixed:混合模式,JVM自己来决定是否编译成本地代码 XX参数 非标准化参数 相对不稳定 主要用于JVM调优和Debug Boolean类型 格式:-XX:[±]表示启用或...

jiuweideqixu的博客 2454

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

20201030使用jvisualvm排查内存溢出(OOM)过程

内存溢出在开发中或者线上出现的概率很高,造成的直接结果是系统运行缓慢,或者直接宕机。 在这里模拟下内存溢出的情况以防患于线上出现内存溢出要如何排查问题,线上出问题需要生成一个快照(hprof文件),在本地查看问题。 其他工具调试如阿里的Arthas、MAT、jvisualvm。 1,准备一个可以出现内存溢出的代码: public class TestOOM { public static void main(String[] args) { List<Object&

陈如水的专栏 1830

JVM——14.定位 Heap OOM

文章目录1. JVM 对象分配2. 什么情况会发生 Heap OOM3. 模拟 Heap OOM4. Heap OOM 的定位及解决 1. JVM 对象分配 前面两篇文章介绍了Metaspace区和Java虚拟机栈的内存溢出的分析及解决方案;一般来说,只要配置了合理的jvm参数和代码上注意一些,是不太容易发生这两块区域的内存溢出的。 真正最容易发生OOM的,是在 Java堆 中,也就是由于 平常系统中创建出来的对象实在太多了,最终导致了系统的OOM; 前面也介绍过了jvm运行时在堆中创建对象和回收的流程,在

m0_52325992的博客 761

【JVM】Jmap与MAT分析内存溢出

文章目录一. 内存溢出模拟以及导出内存映像文件1.1 自动导出内存映像文件1.2 jmap -dump 导出内存映像文件1.3. jmap -heap 命令显示堆信息二. MAT 分析内存映像文件 一. 内存溢出模拟以及导出内存映像文件 文末贴详细代码,这里给出部分代码: @RestController @RequestMapping("memory") public class Memory...

lililuni的博客 1358

【愚公系列】2023年11月 大数据教学课程 008-JVM内存溢出分析

内存溢出是指程序在运行过程中申请的内存超过了系统所能提供的内存空间。当程序运行时,需要申请内存空间来存储变量、对象等数据,如果程序申请的内存超出了系统所能提供的物理内存,就会导致内存溢出。内存溢出会导致程序崩溃或表现异常,甚至会导致操作系统停止运行。常见的内存溢出原因包括无限递归、内存泄露、大量数据存储等。为避免内存溢出,程序员需要充分利用内存,避免占用过多的内存,提高内存使用效率。

愚公智库 6万+

JVM内存溢出:原因分析与解决方案

内存泄漏是指程序中已分配的内存无法被垃圾回收器回收,导致内存占用逐渐增加,最终可能导致系统崩溃。静态内存泄漏:静态对象在程序运行期间一直存在,无法被垃圾回收器回收。静态内部类内存泄漏:静态内部类持有外部类的引用,导致外部类无法被垃圾回收。静态集合类内存泄漏:静态集合类中的对象无法被垃圾回收器回收。线程内存泄漏:线程在执行过程中未正确释放资源,导致内存泄漏。

我是Java程序员廖志伟,感谢朋友们的支持! 1163

JVM优化-内存溢出的定位与分析(MAT工具的使用)

通过MAT工具对dump文件进行分析 1.MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰 富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析 工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止 了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。 下载地址:https://www.eclipse.org/downloads/download.php 二、内存溢出

qq_43621789的博客 788

JVM离线分析-使用MAT分析dump堆文件

官方介绍简要说明:MAT用来分析jvm的内存信息,内存信息包含两方面对 dump 文件建立多种索引,并基于索引来实现内存分布、对象间依赖、对象状态、条件检索这四大核心功能,并通过可视化展现辅助 Developer 精细化了解 JVM 堆内存全貌。 分析堆文件 MAT的直方图和jmap的-histo命令一样,都能够展示各个类的实例数目以及这些实例的Shallowheap总和 with outgoing references:此对象引用了哪些对象, with incoming references:此对象被谁引

guo20082200的博客 3837
上一篇: ConcurrentHashmap size 1.8方法实现
programmeryu
博客等级 码龄11年 23粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值