Java线上应用故障排查之一:高内存占用

转载地址:http://www.blogjava.net/hankchen

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

1、java.lang.OutOfMemoryError: PermGen space

2、java.lang.OutOfMemoryError: Java heap space

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工具分析是否存在内存泄漏等等。

Java线上应用故障排查之一:高内存占用相关推荐

  1. Java线上应用故障排查之二:高内存占用

    前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...

  2. Java线上应用故障排查之一:高CPU占用

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hank ...

  3. 线上应用故障排查之二:高内存占用

    为什么80%的码农都做不了架构师?>>>    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2 ...

  4. 排查Java线上服务故障的方法和实例分析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 作为在线系统负责人或者是一个技术专家,你可能刚刚接手一个项目就需要处理紧急故障,或者被要求帮忙处理一些紧急的故障,这个时 ...

  5. java线上处理故障_线上故障处理手册

    摘要 通常处理线上问题的三板斧是重启-回滚-扩容,能够快速有效的解决问题,但是根据我多年的线上经验,这三个操作略微有些简单粗暴,解决问题的概率也非常随机,并不总是有效.这边总结下通常我处理应用中遇到的 ...

  6. 线上应用故障排查之一:高CPU占用

    流程执行命令: 1.top  查到pid 28555 2.ps aux|grep 28555 确定到是tomcat的进程 3.显示线程列表 ps -mp 28555 -o THREAD,tid,tim ...

  7. [转载]线上应用故障排查之一:高CPU占用

    以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以 ...

  8. 线上OOM故障排查——Curator retryPolicy的选择、Jute.maxBuffer的配置

    本来悠闲地写着bug喝着茶的,突然被一连串报警信息打断. CPU使用率飙升.内存使用率超出阈值.服务未定时打印指定的日志内容(公司日志监控平台)等一系列报警... 因为CPU使用率飙升.内存使用率超出 ...

  9. grep检索关键字的命令_linux系统中java线上问题常用排查命令

    查询java线程占用的资源 1.ps -aux | grep java或者 jps 命令,找出java进程的pid 1564. 2.top -H -p 1564 查看进程下的线程资源占用情况 3.js ...

最新文章

  1. php 接受数组_PHP接收前端发送的数组
  2. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
  3. 记录no static method cannot be reference
  4. 阿里架构师进阶23期精讲:Redis、Kafka、Dubbo、Docker等
  5. java for新循环_Java 8 新语法习惯 (for 循环的函数替代方案)
  6. JavaWEB过滤器和监听器技术
  7. 计算机组成原理中移码怎么算,计算机组成原理中移码是怎么回事?
  8. 在公司具备这三个条件,就准备好跳槽吧
  9. ACL2020 | 什么时候值得用BERT上下文嵌入
  10. c盘哪些文件可以删除_原来C盘可以删除这5个文件,难怪你的电脑越来越卡
  11. 级数 p级数 q级数 调和级数为什么叫做“调和”级数 等比数列求和公式和等差数列求和 斜率:
  12. codeforces-831A(Unimodal Array)
  13. 推荐6款习惯养成APP,送给想要提升自己的人!
  14. 虚拟化原理 内存虚拟化 Intel EPT
  15. 【LeetCode】灯泡开关Ⅰ~ Ⅳ(你还是把我关了吧)
  16. 利用Python3开发一款小工具(环境配置)
  17. sim卡无线上网公用服务器,云SIM卡池,云SIM卡解决方案,流量分发随身WIFI方案( 忻瑞科技)...
  18. 【前端大屏实战1】Vue+Echarts -- 大屏简介初体验 => 大屏自适应缩放解决方案 => 使用transform:scale => 组件化抽离ScaleBox=>【两分钟实现大屏宽高等比例】
  19. SVN 在Eclipse中使用
  20. PT SDC命令持续更新中

热门文章

  1. android投屏乐视,手机投屏Letv电视的三种办法【乐播投屏】
  2. nginx配置一个端口下多个路径转发到html下不同目录
  3. x210开发板升级glibc-2.10到glibc-2.18版本的解决方案
  4. Scikit-learn学习系列 | 2. sklearn数据预处理的相关方法
  5. 谷歌(google)世界各国网址大全世界各国google网址
  6. android+kitchen最新优化版下载,AKitchen app下载-AKitchen 安卓版v2.2.1-PC6安卓网
  7. sql中update操作中为什么会出现“0行受影响”
  8. 基于Jetson Nano2GB 的 40Pin学习 GPIO 点亮LED灯笔记记录
  9. 蓝桥杯单片机学习4——独立按键矩阵按键
  10. 金蝶KIS标准版 运行时错误 ‘3800‘: ‘PrimaryKey‘ 不是此表中的一个索引 解决方法