51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1218|回复: 0
打印 上一主题 下一主题

[原创] 双剑合并-剥开内存溢出的真相

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-2-22 09:30:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题描述
  对于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个文件的分析定位出内存溢出(内存使用过度导致)的原因。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-15 03:54 , Processed in 0.064715 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表