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

摘要:
开发或在线时内存溢出的概率非常高。直接原因是系统运行缓慢或直接停机。小编在这里模拟内存溢出,防止在线内存溢出。我在这里只演示了jvisualvm——Xmx是在jvm运行期间分配的最大内存。例如,-Xmx4m表示jvm进程最多只能占用4M内存。使用jvisualvm.Exe打开生成的hprof文件。还分析了内存溢出的原因是由于对象的疯狂创建。

内存溢出在开发中或者线上出现的概率很高,造成的直接原因就是系统运行缓慢,或者直接宕机了。

小编在这里模拟下内存溢出的情况以防患于线上出现内存溢出要如何排查问题。题外话(线上出问题你需要生成一个快照(hprof文件),在本地查看问题),当然了还有其他工具调试如阿里的Arthas、还有MAT。我这里只演示jvisualvm。

我使用的jdk版本是jdk1.8.0_05

先准备一个可以出现内存溢出的代码
使用jvisualvm排查一次内存溢出(OOM)过程第1张

 之后在IDEA中配置VM参数【-Xms2m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\jvmtest】

使用jvisualvm排查一次内存溢出(OOM)过程第2张

说明一下:

-Xms 为jvm启动时分配的内存,比如-Xms2m,表示分配2M。

-Xmx 为jvm运行过程中分配的最大内存,比如-Xmx4m,表示jvm进程最多只能够占用4M内存。

-XX:+HeapDumpOnOutOfMemoryError 表示出现OutOfMemoryError异常时,记录快照。

-XX:HeapDumpPath 表示快照的存储位置(这里可以设置文件名字,也可以不设置),不设置名字它会自己生成的。

执行后,会抛出如下异常
使用jvisualvm排查一次内存溢出(OOM)过程第3张

 看到如下:Heap dump file created [5505387 bytes in 0.042 secs],那就计算下使用了多少M

使用jvisualvm排查一次内存溢出(OOM)过程第4张

 可以看得出,明显超出了4M。使用jvisualvm.exe来打开生成的hprof文件

使用jvisualvm排查一次内存溢出(OOM)过程第5张

 提示内存溢出了。点击main线程进入

使用jvisualvm排查一次内存溢出(OOM)过程第6张

 看到了ArrayList,点进去

使用jvisualvm排查一次内存溢出(OOM)过程第7张

 可以看得到ArrayList的存储大小(33384)。在点击到elementData看看里面存储的什么元素

使用jvisualvm排查一次内存溢出(OOM)过程第8张

 可以清晰的看得出是TestOOMA$OOMObject这个对象,也就是我上面例子中的对象。另外在类视图中也可以看见这个对象在飙升。

使用jvisualvm排查一次内存溢出(OOM)过程第9张

 也就分析出,内存溢出的原因就是因为疯狂的创建对象造成的。

免责声明:文章转载自《使用jvisualvm排查一次内存溢出(OOM)过程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇斐波那契数列(动态规划)SpringBoot怎么访问html文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JDBC的批量查询报告内存溢出解决方法

由于表中的数据过多(我的超过了50W+),查询select * from table ....报告内存溢出 Exception in thread "main"java.lang.OutOfMemoryError: Java heap space at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java...

MAT工具定位分析Java堆内存泄漏问题方法

一、MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版,可以直接解压使用。 我把独立版MAT安装包放到了网盘上,方便直接下载———— 链接:https://pan.baidu.com/s/1...

Jenkins内存溢出的处理方法

参考:http://openwares.net/java/jenkens_deploy_to_tomcat_error_of_outofmemoryerror.html上的说明,有如下解释: -Xms:初始堆内存大小 -Xmx:最大堆内存大,一般设置-Xms与-Xmx一样大小,根据应用类型和物理内存大小来决定二者的大小 -Xmn或者-XX:NewSize:...

【Java】几种典型的内存溢出案例,都在这儿了!

写在前面 作为程序员,多多少少都会遇到一些内存溢出的场景,如果你还没遇到,说明你工作的年限可能比较短,或者你根本就是个假程序员!哈哈,开个玩笑。今天,我们就以Java代码的方式来列举几个典型的内存溢出案例,希望大家在日常工作中,尽量避免写这些low水平的代码。 定义主类结构 首先,我们创建一个名称为BlowUpJVM的类,之后所有的案例实验都是基于这个类进...

php 在docker 中使用composer 报内存溢出的解决方法

最近 需要用到有盟的推送,不想自己写,准备在github上面找个来改改,本地用的环境是docker 镜像,然后在docker 中 composer 时的时候,报了一个错 docker exec -it www /bin/bash root@85c8ee9b5e27:/var/www/html/newyouchengdu# composer require...

服务器内存溢出问题

系统测试时,导出、下载功能,偶尔会出现“out of memory”(内存溢出)问题。 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 引起内存溢出的原因有很多种,常见的有以下几种:1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;2.集合类中有对对象的引用,使用完后未清空,使得...