arthas可以理解为由server, client, spy三大模块组成
整体执行流程
-
启动arthas server,利用JVMTI技术(参考:当我们谈Debug时,我们在谈什么(Debug实现原理)),在运行时attach到jvm进程上
-
arthas server异步调用bind方法,该方法最终启动server监听线程,监听arthas客户端的连接,包括telnet和websocket两种通信方式
-
启动arthas client,请求时,从本地System.in读取,发送到 telnet.getOutputStream(),即发送给远程服务端
-
arthas server接收到客户端请求
-
如果是exit,logout,quit,jobs,fg,bg,kill等直接执行。
-
如果是不需要使用字节码增强的命令,比如监控相关命令,类加载命令,arthas就是通过mbean获取的。
每个java应用均包含一个平台MBean Server,即java.lang.management.ManagementFactory.getPlatformMBeanServer()方法返回对象。
-
比如监控方法运行命令,是需要字节码增强的命令,那么服务端就使用ASM字节码提升,从而就能够获取到比如执行时间之类的信息了
服务端是以任务的形式在后台跑任务(意思就是非阻塞的,后台采样数据),植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何Arthas命令不会引起原有业务逻辑的改变。
-
arthas从telnet.getInputStream()读取远程服务端发送过来的响应,并传递给consoleReader.getOutput(),即在本地控制台输出。