阿丹:
记录一次线上问题的定位,以及解释和讲解一下在docker容器中arthas的使用。
arthas使用文档:
我先给官方的文档放在这里,在文章中我使用的代码和解释我也会写,但是针对于每个人遇到的情况不一样,我这里先给文章的传送门放在这里。
命令列表 | arthas
方便如果你们遇到一样的问题使用了我一样的代码但是出现的场景或者信息不一样的情况下,大家可以自行进入文档中查看。
JVM技术文档--JVM诊断调优工具Arthas--阿里巴巴开源工具--一文搞懂Arthas--快速上手--国庆开卷!!_阿里jvm工具-CSDN博客
这里是我之前写过的一个文章也可以进行参考
在docker中Arthas使用下载与运行
首先进入容器:
docker ps -asudo docker exec -it 对应容器id bash
首先拷贝arthas包下来:
wget https://alibaba.github.io/arthas/arthas-boot.jar
使用java - jar运行Arthas:
java -jar arthas-boot.jar
这样就是已经运行起来了,整体拉取和运行是很简单的。
开始问题定位:
展示实时面板指令:
dashboard
查看线程监控
输入thread命令,会显示所有线程的状态信息
输入thread -n 3会显示当前最忙的3个线程,可以用来排查线程CPU消耗
输入thread -b 会显示当前处于BLOCKED状态的线程,可以排查线程锁的问题
查看jvm信息
使用指令jvm
现象描述:
在问题重现的时候。观察控制面板来看,发现在业务场景下的,大量读取数据出现问题,导致Mysql的线程占据内存过大,并且在整体业务下,是将对象转换为数组之后,写入了文件。这里就出现了一个问题。
在每一次任务结束之后没有触发gc所以出现问题,这里使用了手动GC的方式来解决这个问题。
System.gc()
来告诉JVM,这里需要GC。测试之后没有问题。