当前位置:首页 > 内存 > 正文

arthas排查堆内存过高的问题

  • 内存
  • 2024-09-06 05:08:44
  • 9958

一、Java诊断工具Arthas常见命令(超详细实战教程)


对于Java应用面临多个微服务带来的复杂问题,阿里巴巴开源诊断工具Arthas显得尤为重要。不仅支持在线故障排除,无需重启,还可以实时动态监控代码和JVM状态,适用于各种JDK6+平台。开发人员更喜欢Arthas,因为它的命令行界面和丰富的Tab补全功能。目前它在GitHub上有29,400颗星。


Arthas强大的功能包括但不限于线程、内存、GC和运行状态监控、输入参数/返回值/异常分析、识别应用热点甚至产生火焰。使用智能技术的图表来帮助您快速找到并解决复杂的问题。以下是一些常用命令的操作指南:


运行arthas-demo案例程序:首先,下载并运行。
运行诊断工具:下载并运行它。
诊断工具使用connect函数选择要诊断的目标Java进程,输入1并按Enter键。
使用help命令查看Arthas命令的帮助。
dashboard命令用于监控实时数据,如查看CPU、内存等
thread命令用于查看线程ID的堆栈,如thread1|grep'main('
sc和sm命令分别用于查找加载的类和类函数,支持-d选项获取详细信息。
反编译的代码可以使用jad命令的大部分内容,例如如me使用ognl命令执行动态代码,支持执行OGNL表达式和条件表达式
watch命令可用于查看函数参数、返回值和异常信息以及用法。
此外,Arthas还提供了sysprop和jvm命令来获取系统信息,reset命令用于重置扩展类。在实践中,Arthas可以帮助解决函数调用错误和HTTP请求问题,包括跟踪过滤器函数和检索SpringContext。和组件信息



二、使用jdk常用工具排查故障流程

jps定位进程
jstat存储信息
jstack定位问题线程
jmap定位问题对象

jps用于检查当前正在打开哪些电视。在服务器中并排查问题一般使用jps作为pid
-l参数可以打印完整的类路径或包容器,-v参数可以打印启动参数
。ps-ef|grepjava可以打印启动参数和容器路径,但无法打印classpath类型


jstat用来统计每个region的使用情况。堆栈等信息

下图中,jstat命令gc110005的意思是每隔1000ms打印一次pid为1的进程的堆栈信息,一共打印5次。
S0C容量S0,即总容量使用率=目标空间。
E、O、M分别表示Eden、老年代、元空间的区域。FGC的。

-gc参数显示具体值,-gcutil系统显示


jstack用于查看进程内的线程信息,常用用于故障排除。cpu问题

使用jstack时,一般步骤如下
步骤1.使用top-Hppid从高到低查看进程pid中的线程数和cpu使用率。
这一步要注意什么:CPU使用率较高的线程和运行CPU时间较长的线程(即TIME+列)

问题来了,CPU有多高?
假设CPU有4个核心,其中一个核心运行100%,整个CPU最高运行400%。
如果线程是无限循环(当为真时),CPU通常可以达到90%+,但在100%时,因为即使为真,仍然会有一个旋转段。

另外,CPU运行时间也是最重要的指标。

第二步,导出当前线程数据到线程文件

第三步,根据上一步发现的线程问题,将pid转换成十六进制,因为在thread线程转储,Threadpid以十六进制表示。

第四步,在整个调用栈的dump文件中检索上一步计算出的序列pid的十六进制值

可以看到,这个线程是kafka消费线程

注意:在开发中,必须定义线程名称,并且可以对应到具体的任务,这样,在使用jstack时,就可以使用线程名称。

另外,Thread类的getAllStackTraces方法可以获取正在运行的虚拟机所有线程的堆栈。


jmap用于查看对象处理信息,经常排查内存问题

jmap-dump:live,format=b,file=/root/1将栈中的内容打印到文件中,live参数表示只输出live对象。
备注:
堆文件的大小应与当前堆的使用情况相匹配。如果堆栈使用2G,则堆栈文件为2G,导出过程可能会影响外部服务。
另外,heapdump文件无法用专业工具(如jhat、jvisualvm、mat)查看,也无法用grep等命令恢复。
总之,这个命令在生产环境中很少使用。

jmap-histo:livepid统计类实例的数量和字节数。
通常使用jmap-histo:livepid|greppackge来检查是否有大量内存,页面是包名项目java

jmap-J-D64-heap1配置数据汇总的heap


按照上述步骤通常可以定位问题,但比较困难,需要短时间内进行大量操作,建议使用阿里巴巴阿尔萨斯。