单看javacore ,native_stderr.log,systemout.log 不看headdump .如何诊断OOM(内存溢出)错误?

如题 ,单看javacore ,native_stderr.log,systemout.log 不看headdump文件 .如何诊断OOM(内存溢出)错误? 因为有时候headdump很大,用HA工具打开很慢。很占资源。。显示全部

如题 ,单看javacore ,native_stderr.log,systemout.log 不看headdump文件 .如何诊断OOM(内存溢出)错误? 因为有时候headdump很大,用HA工具打开很慢。很占资源。。

收起
参与35

查看其它 4 个回答wodese7en的回答

wodese7enwodese7en其它其他

首先你得了解到heapdump,javacore和systemout/systemerr所记录的内容的区别:

  1. heapdump是记录JVM中内存分配及对象使用,并且在内存溢出时产生。
  2. javacore是记录线程池中线程的使用对象。
  3. systemout/systemerr是记录日常JVM运行时的输出。
  4. GC log是从JVM启动后,JVM的内存分配的大小变化及每次局部GC和full GC时所释放的JVM内存大小,总体来说会一直不断变化。

搞清楚这方面的问题的后,你还得搞清楚内存溢出的具体区别,内存溢出不一定就是堆溢出。也有可能是GC异常导致的,比如你的年轻代和年老代很配不合理导致GC出现异常等。还有就是常驻内存溢出,本地内存溢出等等。

日常最常见的就是堆内存溢出是JVM堆内存分配的内存被java对象占满时产生的错误。所以首先你得查看heapdump中所有的内存使用情况,找出占用JVM内存多的,当然也包括大对象什么的,比如你的JVM堆分配大小为1024m, JVM正常运行时,jvm的使用大比方说在200-500m之间,但是突然同时来了6个100m左右的数据对象申请比如说文件读取那么这种对象如果直接写到JVM内存也会导致堆内存溢出,而这类的JVM使用情况是记录在heapdump中的。
而javacore记录的是内存溢出时或者你手工生成时,线程池中线程的工作情况,你得结合一起查看,先查看heapdump的相关内存占用情况,再根据查找结果找出最大的占用JVM内存的对象,如果还是查找不出来,再去查看GC日志去查看内存使用的时间曲线,再去推断占用情况。

文化教育其它 · 2017-11-16
浏览5708

回答者

wodese7en
其它其他
擅长领域: 服务器中间件应用服务器

wodese7en 最近回答过的问题

回答状态

  • 发布时间:2017-11-16
  • 关注会员:7 人
  • 回答浏览:5708
  • X社区推广