首先,Arthas是一个优秀的Java诊断利器,能够线上诊断Java进程的异常。Jarboot是一个Java进程的启动器,可以方便的启动一个Java进程,并且附带了一部分的调试命令。Jarboot的调试命令大部分与Arthas中的重合,实现的代码逻辑也是借鉴了Arthas的源码。
应用场景
Jarboot是一个进程启动器,Arthas是一个纯粹的诊断工具,二者的功能定位不同,JVM诊断的功能只是Jarboot中的一部分附带功能,它的主流功能是管理Java服务文件、启动进程、停止进程、监控进程状态、依赖(优先级)启动及停止、进程的守护、进程的优雅退出等等。
架构对比
二者都是通过Java Agent技术Attach到目标进程后再使用ASM技术进行类增强;
Arthas将调试的进程作为了一个服务端,然后可以通过telnet和Web的方式连接该服务;
Jarboot则反过来将目标进程作为一个客户端,让它通过WebSocket协议连接jarboot-server;
Modules
┏━━━━━━━━━━━━━━━━━┓
┃ Browser ┃ ┏━━━━━━━━━━━━━━━━━┓
┗━━━━━━━━┯━━━━━━━━┛ ╭—————┨ jarboot-agent ┠——————————————╮
http│websocket │ ┗━━━━━━━━━━━━━━━━━┛ │JarbootClassLoader
│ │ │
↓ ↓ ↓
┏━━━━━━━━━━━━━━━━━┓ attach ┏━━━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━━━┓
┃ jarboot-server ┠—————————→┃ target process ┠—————→┃ jarboot-core ┃←————╮
┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━┯━━━━━━━━┛ │
↑ │ │
╰—————————————————————————————————————————————————————╯ │
http and websocket connect to jarboot-service │
┏━━━━━━━━━━━━━━━━━┓ │
┃ jarboot-spy ┠—————╯
┗━━━━━━━━━━━━━━━━━┛
Command execute
websocket
┏━━━━━━━━━━━━━━━━━┓ websocket ┏━━━━━━━━━━━━━━━━━┓ send ┏━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Browser ┃←——————————→┃ jarboot-service ┠———————→┃ target process ┃
┗━━━━━━━━━━━━━━━━━┛ send/recv ┗━━━━━━━━━━━━━━━━━┛ ┃ ╭——————————————╮ ┃
↑ ┃ │ user code │ ┃
│ ┃ ╰——————————————╯ ┃
http │ websocket ┃ ╭——————————————╮ ┃
╰——————————————————┃———┥ jarboot-core │ ┃
result back ┃ ╰——————————————╯ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━┛
分析:
1、从影响的侵入性来看,Jarboot的侵入性相对较小,不会在目标进程占用端口,不会开辟大量的线程资源;
2、从响应的速度来看,Arthas相对快些,Jarboot由于是将目标进程作为了客户端,所以它的执行结果反馈是通过了jarboot-service的中转,经历了两次WebSocket通讯才来到前端显示,但是这种毫秒级的差距人的眼睛也分辨不出来,所以影响不是很大;
ui界面
Arthas支持telnet的控制台界面和通过WebSocket推送的Web界面;
Jarboot仅支持Web界面和HTTP接口,界面采用React技术前后端分离策略;
Jarboot的UI界面在可操作性和可维护性上较好。