问题说明
对于B/S体系结构中的J2EE应用程序系统,在应用程序服务器上出现内存溢出错误是一个非常困难的问题,故障排除的关键是确定问题出在哪里。常见的内存溢出原因包括:
Jvm内存参数设置不合理
例如:
-Xmx设置相对较小
-Xms设置太大
未设置Sun的JVM
-XX:MaxPermSize大小等
由于参数设置问题导致的内存溢出往往很容易找到,因此调整参数基本上可以解决问题。
应用程序服务器没有必需的修补程序
例如,某些版本的Websphere有很多性能缺陷,在某些情况下,可能会出现内存溢出。应用修补程序后,可以基本解决问题。
应用程序代码有缺陷
这些问题是内存溢出的最常见原因,本文介绍了如何分析和查找这些内存溢出问题。
解决方法
孔欲想做好那件事,首先要利用那个机构,有好的工具,解决问题往往可以事半功倍,很多时候没有工具支持,问题就很难解决。
本文主要讨论两种工具的使用。
分析JavaCore的工具:IBM thread and monitor dump analyzer for Java。
分析Heapdump的工具:Eclipse Memory Analyzer。
这两个工具基本上可以定位常见的内存溢出问题。
在介绍这两个工具之前,我们将讨论一些相关概念。
Heapdump
Java进程内存在特定时间点的快照,记录内存中每个对象当时的存储和引用关系等。Heapdump不包含对对象的调用信息。这意味着Heapdump无法确定对象生成到的程序代码。
扎瓦斯科尔
记录特定时间点所有线程的执行堆栈信息等的Java进程的线程快照。在JavaCore中,您可以查看每个线程正在处理哪些程序代码、当前Java“在做什么”、线程的执行堆栈中的代码调用信息、对象生成相关信息等。
两个内存溢出
内存溢出一般分为两种。内存使用量过多,内存泄漏。
过度使用意味着短时间内大量内存急剧耗尽,导致内存溢出。
内存泄漏是指长时间内内存逐渐耗尽,导致内存溢出。时间可以是几个小时或几天(打开详细的垃圾收集,可以清楚地观察内存分配)。
Java系统中的内存溢出很少发生内存泄漏,因为内存使用过度。本文后面介绍的也是内存使用过度导致内存溢出的分析方法。
对于内存使用过度导致的内存溢出,可以将Heapdump与JavaCore相结合来分析定位问题;对于内存泄漏,可以主要分析Heapdump。
Heapdump文件和Javacore文件(例如用于部署Websphere的web应用程序)通常在Java进程遇到内存溢出错误时创建,如果发生内存溢出,则位于以下目录
/opt/IBM/WebSphere/appserver/profiles/server 1中出现以下文件:
Heapdump。*。phd文件记录Heapdump信息,JavaCore .*。txt记录javacore信息,在正常内存溢出时,会出现多个PhD文件和JavaCore文件。分析时使用其中一个即可。
下面介绍了如何通过工具分析两个文件,以及如何分析两个文件以找到内存溢出(内存过度使用导致的内存溢出)的来源。
1.javacore分析
Javacore的分析工具IBM thread and monitor dump analyzer for Java(JCA)以图形方式显示Java线程的堆栈信息和相互关系等。以下是工具使用的屏幕截图。
ticle.detail&_iz=31825&index=3" width="640" height="464"/>
对于 Websphere,主要关注 WebContainer 线程的执行堆栈情况,上图显示WebContainer:57 号线程的执行堆栈。Javacore 文件本身就是个文本文件,直接通过文本编辑器如 editplus 也可以打开,下面是用文本编辑器打开 javacore 文件后看到的WebContainer:57 号线程的执行堆栈:
可以看到,通过 JCA 打开 javacore 和通过 editplus 打开 javacore,没有本质的区别,只是展现形式有所区别而已,有关 JCA 工具的具体使用这里不作详细介绍。分析 javacore的重点是根据每个线程的堆栈信息找出哪个或哪几个线程导致 java 进程的内存溢出,对应线程堆栈中的代码段就是罪魁祸首。例如,如果通过分析得到 WebContainer:57 号线程可能导致内存溢出,那么 57 号线程中的这段代码就是问题所在。
为什么是 WebContainer:57 号线程有问题,而不是其它线程呢?这就需要结合heapdump 进行综合分析,下面会有详细介绍。
2.分析 Heapdump
Heapdump 的分析工具推荐 Eclipse Memory Analyzer(简称 MAT),该工具比 IBM 的HA(Heap Analyzer)工具更强大,更易使用。下面是工具的使用截图:
该工具可以看到对象占用内存的大小、对象的个数等信息,通过分析占用内存比例最大的对象,可以初步判断是哪个对象导致的内存溢出,有关 MAT 工具的具体使用这里不作详细介绍。heapdump 分析的重点是找到占用内存最大的“业务对象”,所谓业务对象,就是和应用业务相关的对象,需要能靠到应用程序上。例如上图所示,虽然java.lang.String 比 DicRestrict 对象占用的内存要多,但是我们做分析时应该重点关注DicRestrict 对象,因为 String 对象是通用的业务无关对象,可能很多业务对象都会引用它。Heapdump 分析需要结合业务知识,需要相当的开发和业务经验。
3.双剑合并
Javacore 和 heapdump 的单独分析,都只是看到了事情的一面,通过一定方法将二者有机的结合起来,问题基本就可以水落石出了。
……
由于作者版权要求,仅展示文章的一部分,如需阅读完整版文章,可以私信回复”文章“即可免费获取。
最后:
1)关注+私信回复:“测试”,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试等。
2)关注+私信回复:"入群" 就可以邀请你进入软件测试群学习交流~~
1.《【cfoutofmemory怎么解决】应用服务器发生内存溢出怎么办?有助于解决问题的两个工具》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《【cfoutofmemory怎么解决】应用服务器发生内存溢出怎么办?有助于解决问题的两个工具》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2589952.html