vlambda博客
学习文章列表

​Arthas性能测试调优实践

近期,在对某Java类应用系统性能测试时,发现应用服务器CPU利用率接近100%,并且系统长时间运行还存在内存泄露的情况,我们利用Arthas工具进行了问题代码定位分析,达到了较好的优化效果,过程如下:

性能问题一

问题描述:在混合压力测试场景中,发现应用服务器CPU使用率接近100%。

问题分析:通过TOP查看进程CPU利用率,发现java进程占CPU较高。经分析,Java应用程序中某代码模块存在性能问题。

问题挖掘过程:

1、 查看Java进程id,记录PID为6193

2、 启动arthas,对6193进程进行跟踪,执行dashboard命令查看占用CPU高的线程。

​Arthas性能测试调优实践

3、 执行Thread -n 3命令将占用资源最高的前三个线程的堆栈信息打印出来,通过这三个线程的堆栈信息得到,代码中某类的diedCycle()方法占用CPU资源较高

​Arthas性能测试调优实践

4、 执行jad命令对某类进行反编译,得到出现问题的源代码,通过代码分析,发现这段代码死循环一直占用系统资源,在使用过程中并没有释放这些资源,最终导致服务器CPU利用率100%。

​Arthas性能测试调优实践

​Arthas性能测试调优实践

解决方法:删除diedCycle()方法,经验证,问题解决。

 

性能问题二

问题描述:在稳定性测试过程中,通过查看应用日志发现OutOfMemoryError”报错信息。如下图

​Arthas性能测试调优实践

问题分析:经分析,jvm内存不足,程序代码HashMap或ArrayList对象某代码出现书写缺陷。

问题挖掘过程:

1、启动arthas,执行dashboard查看堆内存和GC使用情况。发现程序持续产生多次FULL GC,且每次FULL GC后并没有清理出垃圾对象,导致老年代的堆内存持续增高。

​Arthas性能测试调优实践

​Arthas性能测试调优实践

2、执行heapdump生成堆存储文件

​Arthas性能测试调优实践

3、对dump文件进行分析,发现main()异常线程 

4、执行Jad命令查看源代码,程序不断的生成字节数组,并将字节数组存储到list容器中死循环导致list容器占用的堆内存持续增长,最终导致无堆内存可用报错OutOfMemoryError 

​Arthas性能测试调优实践

解决办法:对main()函数进行优化。经验证,问题解决。

本次性能调优采用阿里开源的Arthas工具进行监控的,它是一款开源在线Java诊断工具,采用命令行交互模式,支持Linux /Windows,同时提供丰富的Tab自动补全功能方便进行问题的定位和诊断

​Arthas性能测试调优实践

 

Arthas是一个java程序通过命令java -jar arthas-boot.jar启动。

​Arthas性能测试调优实践

举例:

输入dashboard指令进入系统性能全局监控,显示当前系统的实时数据面板(线程、内存、GC、运行信息