51Testing软件测试论坛
标题:
双剑合并-剥开内存溢出的真相
[打印本页]
作者:
个別兴樂
时间:
2022-2-22 09:30
标题:
双剑合并-剥开内存溢出的真相
问题描述
对于B/S架构的J2EE应用系统,应用服务器发生内存溢出(OutOfMemoryError)错误是非常棘手的问题,解决问题的关键是要定位哪里出了问题。一般内存溢出的原因有以下几类:
Jvm内存参数设置不合理
如:
-Xmx设置的比较小
-Xms设置的过大
sun的jvm没有设置
-XX:MaxPermSize大小等等
由于参数设置问题导致的内存溢出往往容易发现,调整一下参数,问题基本就可以解决。
应用服务器缺少必要的补丁
例如Websphere的某些版本存在很多性能缺陷,某些情况下也会导致内存溢出,打上补丁后,问题基本可以得到解决。
应用程序代码存在缺陷
此类问题是内存溢出最常见的原因,解决起来也最麻烦,本文主要描述这类内存溢出问题如何进行分析和定位。
解决方案
工欲善其事,必先利其器,有了好的工具,解决问题往往能起到事半功倍的作用,很多时候没有工具支持,问题很难解决。
本文主要涉及到2个工具的运用:
分析JavaCore的工具:
IBM
Thread and Monitor Dump Analyzer for Java。
分析Heapdump的工具:Eclipse Memory Analyzer。
通过这2个工具,一般的内存溢出问题基本可以定位。
在介绍这2个工具之前,先对一些相关概念做下解释说明:
Heapdump
某一时刻Java进程内存的快照,
记录
当时内存中各对象的存储和引用关系等。Heapdump中不包含对象的调用信息,即无法从Heapdump中看出某个对象是哪段程序代码生成出来的。
JavaCore
某一时刻Java进程中线程的快照,记录当时所有线程的执行堆栈信息等。JavaCore中可以看到各线程都在处理哪些程序代码,可以看到当前Java都在“做什么事”,在线程的执行堆栈中,有代码的调用信息,也有对象生成的相关信息等。
两种内存溢出
内存溢出一般分两种,内存使用过度和内存泄露。
使用过度指在短时间内急剧耗尽大量内存导致内存溢出。
内存泄露指长时间内,内存逐渐耗尽导致内存溢出,时间可能是几个小时或几天(通过开启详细垃圾回收可以清晰地观察到内存的分配情况)。
Java系统的内存溢出大部分都是由于内存使用过度导致,内存泄露比较少见。本文后面介绍的也都是关于内存使用过度导致内存溢出的分析方法。
对于内存使用过度导致的内存溢出,可以通过Heapdump和JavaCore结合分析定位问题,对于内存泄露,主要还是分析Heapdump。
当Java进程出现内存溢出错误时,通常会生成Heapdump文件和JavaCore文件,例如Websphere部署的
web
应用,当出现内存溢出时,会在如下目录
/opt/IBM/WebSphere/AppServer/profiles/server1看到出现类似这样的文件:
[attach]136529[/attach]
Heapdump.*.phd文件记录Heapdump信息,javacore.*.txt记录JavaCore信息,一般内存溢出时会出现多个phd文件和JavaCore文件,分析时用其中一个即可。
下面就介绍如何通过工具分析这2个文件,如何通过对这2个文件的分析定位出内存溢出(内存使用过度导致)的原因。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2