美文网首页
高内存占用处理方法

高内存占用处理方法

作者: 小墨哈 | 来源:发表于2017-03-16 19:39 被阅读212次

前一篇介绍了线上应用故障排查之一:高CPU占用
,这篇主要分析高内存占用故障的排查。

搞Java开发的,经常会碰到下面两种异常:

1、java.lang.OutOfMemoryError: PermGen space
2、java.lang.OutOfMemoryError: Java heap space

要详细解释这两种异常,需要简单重提下Java内存模型

Java内存模型是描述Java程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。

在Java虚拟机中,内存分为三个代:新生代(New)、老年代(Old)、永久代(Perm)。
(1)新生代New:新建的对象都存放这里
(2)老年代Old:存放从新生代New中迁移过来的生命周期较久的对象。新生代New和老年代Old共同组成了堆内存。
(3)永久代Perm:是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。

如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。原因有二:
(1)Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。
(2)代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)。

如果出现java.lang.OutOfMemoryError: PermGen space,说明是Java虚拟机对永久代Perm内存设置不够。
一般出现这种情况,都是程序启动需要加载大量的第三方jar包。例如:在一个Tomcat下部署了太多的应用。

从代码的角度,软件开发人员主要关注java.lang.OutOfMemoryError: Java heap space异常,减少不必要的对象创建,同时避免内存泄漏。
现在以一个实际的例子分析内存占用的故障排查。

通过top命令,发现PID为9004的Java进程一直占用比较高的内存不释放(24.7%),出现高内存占用的故障。
想起上一篇线上应用故障排查之一:高CPU占用
介绍的PS命令,能否找到具体是哪个的线程呢?

ps -mp 9004 -o THREAD,tid,time,rss,size,%mem

遗憾的是,发现PS命令可以查到具体进程的CPU占用情况,但是不能查到一个进程下具体线程的内存占用情况。

只好寻求其他方法了,幸好Java提供了一个很好的内存监控工具:jmap命令

jmap命令有下面几种常用的用法:

jmap [pid]
jmap -histo:live [pid] >a.log
jmap -dump:live,format=b,file=xxx.xxx [pid]

用得最多是后面两个。其中,jmap -histo:live [pid] 可以查看当前Java进程创建的活跃对象数目和占用内存大小。
jmap -dump:live,format=b,file=xxx.xxx [pid]则可以将当前Java进程的内存占用情况导出来,方便用专门的内存分析工具(例如:MAT)来分析。
这个命令对于分析是否有内存泄漏很有帮助。
这里详细介绍下jmap -histo:live [pid] 命令:

从上图可以看出,int数组、constMethodKlass、methodKlass、constantPoolKlass都占用了大量的内存。
特别是占用了大量内存的int数组,需要仔细检查相关代码。

最后,总结下排查内存故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的内存使用情况。
2、jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
3、jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在内存泄漏等等。

转自:http://www.blogjava.net/hankchen

相关文章

  • 高内存占用处理方法

    前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。 搞Java开发的,经常会碰到下...

  • App中图片特别多,导致内存占用非常高怎么办?

    App中图片特别多,导致内存占用非常高怎么办? 在使用SDWebImage加载图片过多导致内存非常高该如何处理 解...

  • ceph的内存控制

    目的 控制ceph-osd进程内存占用的方法。 观测内存占用的工具 top gperftool ceph日志 to...

  • 类方法和实例方法的误区

    误区一 类方法常驻内存,所以比实例方法效率高。事实上,在加载时机和占用内存上,类方法和实例方法是一样的,在类第一次...

  • 高cpu占用处理方法一

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。1.根据top命令,发现PID为2...

  • 高cpu占用处理方法二

    上一篇给出了一种查找高cpu占用问题的方法,这一篇给出的是和上一篇有差别的地方。1.top查看当前系统状况 2.使...

  • Bitmap优化详谈

    目录介绍 01.如何计算Bitmap占用内存1.1 如何计算占用内存1.2 上面方法计算内存对吗1.3 一个像素占...

  • 性能监控命令 | MEMORY

    CPUMEMORYIONETWORKLINUX进程内存占用查看方法 MEMORY 首先说说虚拟内存和物理内存: 虚...

  • Linux系统内存占用过高—处理方法

    关于 当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为cach...

  • 性能优化相关

    一、内存占用分析方法:1、单步注释法(适用于后台服务,逻辑较少,可以知道某个方法占用了多少内存,但是针对逻辑复杂的...

网友评论

      本文标题:高内存占用处理方法

      本文链接:https://www.haomeiwen.com/subject/dsxmgttx.html