JAVA内存泄漏问题排查

  • 排查是否是内存泄漏
  1. 定位占用CPU最高的java进程ID

执行top命令

  1. 查看内存使用概况

jmap -heap java进程ID

如上图,jvm划分为几个区,重点看每一个区总空间及总使用率情况。如果全部空间总使用率加起来超过MaxHeapSize的80%,说明内存大概率存在泄漏。

注意: PS Old Generatrion分区占用率超过90%,也大概率存在内存泄漏。

  1. 查看占用CPU最高的java线程

top -Hp java进程ID

运行几次并截图保留下来。如上图排在最顶部的第一个线程号记录下来,然后通过以下命令将java线程号转换成16进制(后续在jstack定位线程用到)

printf '%x\n' java线程号

  1. 抓取java线程日志,定位线程最高的java线程及其正在执行的代码

jstack -l JAVA进程ID > s1.log

注意:国产环境下Tongweb不支持jmap命令,可以通过tongweb管理界面的线程日志快照转储出来。

  1. 从线程日志中定位线程

linux下 用vi打开日志文 vi s1.log

然后按下键盘/ ,进入搜索内容模式,输入在(3)步骤中找到的CPU最高的16进制线程ID。

定位到线程,如果线程正在执行我们编写的代码,大概率此代码存在死循环。

如果线程类似如下:

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f9af801e800 nid=0x1d00a runnable

说明此是因为内存泄漏,导致GC内存回收线程在大量内存对象中查找可回收内存从而从而耗尽CPU。

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值