对于Java应用面临多个微服务带来的复杂问题,阿里巴巴开源诊断工具Arthas显得尤为重要。不仅支持在线故障排除,无需重启,还可以实时动态监控代码和JVM状态,适用于各种JDK6+平台。开发人员更喜欢Arthas,因为它的命令行界面和丰富的Tab补全功能。目前它在GitHub上有29,400颗星。
Arthas强大的功能包括但不限于线程、内存、GC和运行状态监控、输入参数/返回值/异常分析、识别应用热点甚至产生火焰。使用智能技术的图表来帮助您快速找到并解决复杂的问题。以下是一些常用命令的操作指南:
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
按照上述步骤通常可以定位问题,但比较困难,需要短时间内进行大量操作,建议使用阿里巴巴阿尔萨斯。
上一篇:华为畅享10可以扩展内存卡
下一篇:空间明明很大显示内存不足