前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。
搞Java开发的,经常会碰到下面两种异常:
1、java.lang.OutOfMemoryError: PermGen space
2、java.lang.OutOfMemoryError: Java heap space
要详细解释这两种异常,需要简单重提下Java内存模型。
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen)
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)来分析。
这个命令对于分析是否有内存泄漏很有帮助。具体怎么使用可以查看本博的另一篇文章:利用Eclipse Memory Analyzer Tool(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工具分析是否存在内存泄漏等等。
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen)
分享到:
相关推荐
NULL 博文链接:https://ainn2006.iteye.com/blog/1549724
线上故障排查方法记录
Java线上故障排查方案(2).pdf
Java线上故障排查方案 结合实战,超详细Java线上故障排查方案总结,值得收藏
线上故障排查全套路,总有一款适合你线上故障排查全套路,总有一款适合你来自:fredal的博客链接:https://fredal.xin/java-error-c
JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!.docx
大厂高手骆俊武出品的《漫谈线上问题排查》电子书
APM应用监控故障排查.pdf DAM软件分发故障排查.pdf EAD可控软件管理故障排查.pdf EAD补丁管理故障排查.pdf EAD防病毒软件故障排查.pdf iMC BIMS组件问题分析.pdf iMC双机冷备方案故障排查.pdf WSM资源管理...
802.1x与EAD故障排查 AM接口故障排查 ARP-DETECTION故障排查 BGP MPLS故障排查 BGP故障排查 BPDU Tunnel故障排查 DHCP Server故障排查 DVPN HUB-HUB DVPN HUB-SPOKE 2 DVPN HUB-SPOKE DVPN DVPN故障排查 E1POS...
JAVA线上问题排查和工具 内容详细 结合实际工作 贴合实际
java cpu 内存占用高 问题 模拟并排查 https://blog.csdn.net/jiankunking/article/details/79749836 https://blog.csdn.net/jiankunking/article/details/79749483
线上问题排查常用命令,包含linux命令,jstat,jinfo,jps等命令
主要介绍了JAVA线上常见问题排查手段(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
当用户量过大,或服务器性能不足以支持大用户量,但同时又得不到扩容的情况下,进行性能分析,并对系统、应用、程序进行优化显得尤为重要,也是节省资源的一种必不可少的手段。目前大多数运维产品都基于JAVA语言开发...
线上问题的排查方法及工具手段,对开发或者运维排查线上问题有很大帮助及使用排查问题使用的工具介绍
熟悉可用于故障排查的各种工具并知道如何使用它们来隔离问题可加快故障排查过程并减少停机时间。 目录: • 故障排查任务 • 找到并安装故障排查工具 • 帮助和支持中心 • ...
1. 查一下 xx.xx.16.28 的内存使用情况 2. 排查最近是否有新上线服务,导致内存紧张 3. 排查是否有 Java 服务在持续 FGC 1. 以为
二、Modules 1.jumpregister Jumpserver自注册 2.jumpserver 0.3.x版Jumpserver跳板机 3.alpine-ext:weak 轻量sshd (业务负载的基础镜像层) 三、快速开始 帐号信息 web: jumpadmin jumpadmin 端口:8888 ssh: ...
NodeJs内存占用过高的排查实战记录 一次线上容器扩容引发的排查,虽然最后查出并不是真正的 OOM 引起的,但还是总结记录一下其中的排查过程,整个过程像是破案,一步步寻找蛛丝马迹,一步步验证出结果。 做这件事...