JVM内存溢出分析

我们在使用java开发程序的过程中,一定会碰到到内存溢出异常(java.lang.OutOfMemoryError)。下面我来看一下出现内存溢出的原因和解决办法。

1.启动参数内存值设定的过小。

调整JVM启动参数,-Xmx JVM使用的最大内存,运行过程中超过这个内存就会报内存溢出异常,-Xms JVM初始内存,启动的时候就占用的内存。如果机器内存够就加机器内存。

2.代码问题

我们重点看这部分,怎么找到造成内存溢出的代码在哪里。下面是可能造成内存溢出的情况:

  • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  • 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  • 代码中存在死循环或循环产生过多重复的对象实体;

第一步:查询进程PID

使用下面的命令查询包含java的进程得到进程PID

ps -ef | grep java

第二步:得到JVM dump

使用下面的命令得到JVM dump(注意:获取dump的过程中JVM是暂时停止服务的,生产上尽量不要使用!)

jmap -dump:live,format=b,file=heap.hprof PID

除了通过上面的命令获取dump外,我们可以为JVM加下面的启动参数。在发生OutOfMemoryError的时候自动得到JVM dump。

#出现 OOME 时生成堆 dump: 
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址:
-XX:HeapDumpPath=/home/dump

第三步:使用JVM分析工具分析内存

我们这次使用Eclipse Memory Analyzer(其他的分析工具也可)来分析dump,去找到内存溢出的原因。下面简单介绍一下Eclipse Memory Analyzer分析工具的使用步骤。

1.导入dump文件,选择Leak Suspects Report,分析工具会自动找出可能引起内存溢出的对象。

2.找到可能引起内存溢出的对象后,如果是自己项目写的对象可以很容易找到代码,针对代码作出修改。如果是第三方依赖的对象,就需要根据具体的依赖具体分析。比如下面的com.sun.jmx.mbeanserver.JmxMBeanServer对象太大导致内存溢出,工具还给出的引用链帮助找出问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值