双剑合并-剥开内存溢出的真相

发表于:2022-2-22 09:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:云竹    来源:51Testing软件测试网原创

  问题描述
  对于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看到出现类似这样的文件:

  Heapdump.*.phd文件记录Heapdump信息,javacore.*.txt记录JavaCore信息,一般内存溢出时会出现多个phd文件和JavaCore文件,分析时用其中一个即可。
  下面就介绍如何通过工具分析这2个文件,如何通过对这2个文件的分析定位出内存溢出(内存使用过度导致)的原因。


......
查看更多精彩内容,请点击下载:
  版权声明:本文出自《51测试天地》第六十四期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号