java程序内存占用过高问题排查

一、现象

收到线上机器报警(内存使用过高),对报警的机器节点重启后恢复正常,搁天后新的节点又开始报警;

二、排查

直接对线上机器执行dump命令,由于线上机器还有流量在持续请求,因此dump时间比较长,生成的dump文件有16G+;因此我们先摘除了问题节点的流量,执行dump命令:

ps -ef|grep java 获取服务的pid

jmap -dump:live,format=b,file=/opt/mydump.hprof 3915 (只dump存活的日志)

生成的dump文件13G左右,压缩后还有3G,把mydump.hprof文件下载到本地

三、分析

用jprofiler工具进行分析,下面是分析步骤:

1.打开要分析的快照文件

 

 

2.点击最大对象

 选择占用内存最大的对象,点击使用选定对象

选择传出引用,outgoing references 点击确认

 

 

3.点击reference引用查看

点击reference会显示刚才选定的最大对象的引用

 展开查看详细信息,可以看到是由于线程池使用了无界队列(默认int的最大值)导致,队列中的任务有223589个,内存总占用7900MB

 点击传入引用Incoming references,展开详细信息,展示更多,可以看到具体引用的类,InterflowProxy就是代码中用到线程池的类

 至此,可以定位到具体占用内存过高的代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值