arthas 内存占用过大排查

使用经验分享

线上故障排查思路:
1、紧急处理,优先保障服务可用(如切换vip,主备容灾)
2、保留第一现场,通过jstack -l {pid} > jvmtmp.txt ,打印栈信息 (后续可以在gceasy官网上传报文进行分析)
3、通过arthas工具进行线上故障问题。执行命令如下

 
dashboard,优先通过看板,找到问题线程id
thread {id},查看问题线程的栈信息
watch {class} {method} {ognl表达式},观察问题方法的上下文

前言

arthas是阿里的一款线上故障分析工具,对jvm当前的上线文可以进行实时监控,下文会介绍我在实际过程中是如何使用arthas来定位问题的。

背景
测试反应系统反应较慢,后端服务无法进行响应;

故障分析
一个月前的测试使用中并未出现该问题,原因可能:

1、近期业务编码出现问题(多层循环、逻辑错误等);

2、近期大数据量测试,数据量增大内存不够;
 

dashboard

通过看板形式,分析当前jvm整体状态

[arthas@22683]$ dashboard

通过图片可以看出,线程http-nio-9030-exec-8、http-nio-9030-exec-7执行耗时查过1小时,并且伴随着大量的GC线程。初步判断线程可能存在深度递归或者死循环,产生了大量内存,JVM疲于GC,GC期间系统会发生STW(Stop The World),且占用了大量CPU资源,因此导致其他服务线程无法正常工作
 

thread

知道问题线程后,我们可以利用thread分析下线程状态

monitor

为了验证我们得到的业务代码(calcCollectionDate(CashFlowAnalyzeServiceImpliava:1780))是否是问题发生处,我们可以利用monitor进行监控,每5秒打印该方法的调用频率:

monitor -c 5 com.psbc.abs.assetpool.service.assetpool.impl.CashFlowAnalyzeServiceImpl calcCollectionDate

watch

通过代码分析,com.psbc.abs.assetpool.service.assetpool.impl.CashFlowAnalyzeServiceImpl calcCollectionDate用于生成产品计算日归集日。因此我们利用watch方法,尝试打印它的上下文,找到关键信息

watch com.psbc.abs.assetpool.service.assetpool.impl.CashFlowAnalyzeServiceImpl calcCollectionDate "params[0].getBillDataVO()" -x 2 | grep billCode

结论

最终,我们定位到了故障起因。代码中有while循环,当页面输入的条件始终满足while时就会出现死循环。当系统资源不够使用时发生频繁GC,最终消耗大量CPU资源,系统卡顿。

参考:

Arthas使用方法_arthas 启动-CSDN博客

JDK内置开发工具 + 诊断工具详解_openjdk jjs-CSDN博客

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arthas是一款Java应用诊断工具,它可以帮助我们排查Java应用中的各种问题,包括内存溢出。下面是使用Arthas排查内存溢出的步骤: 1. 下载并安装Arthas。可以从官网下载最新版本的Arthas,并按照官方文档中的说明进行安装。 2. 启动Arthas。在命令行中输入以下命令启动Arthas: ``` $ java -jar arthas-boot.jar ``` 3. 选择需要排查的Java应用。如果要排查的Java应用已经在运行中,可以使用以下命令选择应用: ``` $ select <pid> ``` 其中,`<pid>`是Java应用的进程ID。如果要排查的Java应用还未启动,可以使用以下命令启动应用并选择: ``` $ java -jar myapp.jar $ select -c com.example.MyApp ``` 其中,`myapp.jar`是Java应用的可执行文件,`com.example.MyApp`是Java应用的主类。 4. 查看Java内存使用情况。使用以下命令查看Java内存使用情况: ``` $ jmap -histo ``` 这个命令会输出Java堆中各个对象类型的数量和大小。 5. 查看Java虚拟机内存使用情况。使用以下命令查看Java虚拟机内存使用情况: ``` $ jstat -gcutil ``` 这个命令会输出Java虚拟机各个内存区域的使用情况。 6. 查看Java进程的线程堆栈。使用以下命令查看Java进程的线程堆栈: ``` $ thread ``` 这个命令会输出Java进程中各个线程的堆栈信息。 7. 根据输出结果找出内存溢出的原因,并进行相应的修复。 以上就是使用Arthas排查内存溢出的步骤。需要注意的是,Arthas只是一款诊断工具,它无法解决问题,只能帮助我们定位问题。因此,在找到问题后,还需要进行相应的修复。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值