java应用占用内存过高排查解决

java应用占用内存过高排查解决

故障:收到服务器报警,内存使用率超过80%

1.查看

使用dstat和top查看内存使用最高的应用
使用dstat
image.png
查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况

使用top
image.png
可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程 一个应用占了28.7的内存

2.定位线程问题

使用ps查看16494的线程情况
命令:ps p 16494 -L -o pcpu,pmem,pid,tid,time,tname,cmd
image.png
看到16494这个pid的应用产生了很多线程。

3.查看内存使用的堆栈

使用jstack查看
我们挑选了TID=17417的线程进行分析
在分析前需要将17417这个id转换为16进制,方便查找信息

[root@localhost ~]# printf "%x\n" 17417
4409

16进制为4409
将pid为16494的应用打印到日志中
[root@localhost ~]# jstack -l 16494 > jstack.log

4.查看内存堆栈信息

[root@localhost ~]# vim jstack.log
在日志信息中查找刚刚转换的4409
image.png
可以看到这个线程状态为WAITING
通过查看日志发现有大量的 waiting on condition
parking to wait for <0x0000000085dce510>
存在大量线程等待被唤醒,占用大量内存

5.代码优化

将相应日志发送给相应开发,优化线程

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhaixing_0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值