Arthas工具有什么用具体百度。
安装:
打开iterm;输入: curl -O https://alibaba.github.io/arthas/arthas-boot.jar
出现类似这些的就是完成了。
启动:
直接:java -jar arthas-boot.jar
这样就是完成了,可以看到罗列了很多的进程出来,我们输入要监控的那个进程前面那个编号1,2,3,4就可以。
容易报错:
[ERROR] Target process 11685 is not the process using port 3658, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 4363, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
原因:上次执行arthas后,未执行shutdown进行关闭。导致了端口占用,按照它给的提示,重新随意指定一个端口号给它启动。
输入:java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999
搞定,启动成功:
看见那个$符号,就是打开进入了监控客户端。可以使用quit(退出当前客户端)、stop\shutdown(关闭arthas服务端,并退出所有客户端)。除了在命令行查看外,还可以通过浏览器访问http://127.0.0.1:8563/查看。
浏览器输入:http://127.0.0.1:8563
输入:dashboard可以看仪表盘(如果这些数据看不懂什么作用,可以先看JVM)
关闭的时候记得stop,不然下次启动就会端口占用了
快速排错:
我先故意写个死循环
然后调用一下这个方法。再看回仪表盘。
可以看到仪表盘被线程ID为23的任务搞炸了CPU99%;
再康康内存使用情况~
可以看到,老年代已经被挤爆炸,奇怪的是那个nonheap非堆内存,也就是堆外内存,居然也很爆炸,为什么会这样呢?死循环创建对象,而对象不都是在堆上分配吗???
百思不得其解的我在网上看到一个解释:
非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
emmmm~~~姑且相信这样解释吧,虽然对象是堆上分配,但是还有部分信息是在占用堆外内存的。如果有真正懂的可以留言告诉我一声不胜感激哦~
这么严重?于是,赶紧输入:
thread 23
去查看这条线程到底在干嘛,为什么这么爆炸。
直接找到对应的方法,原来是死循环,那就赶紧@到对应的开发者改~
对于这套简单的工具,还有很多其他好玩好用的方法,具体的可以看这个博客介绍得更详细:
https://blog.csdn.net/u013735734/article/details/102930307