arthas 源码分析 篇一 【结构篇】
框架
前期准备
1、 github源码地址
1.1、 官方文档
2、 下载下来 idea打开。
3、选择idea build操作。如果出现cannot resolve symbol。需要重新建立索引
重建索引资料点击查看
此时就可以看到正常的项目
模块 - 1、arthas-agent
该模块主要是基于javaagent技术,让用户通过两种方式干预java应用过程中对 java class字节码进行crud的一种操作。
该操作是非常危险的,但往往伴随着
a) 通过 附属agent包方式
-javaagent:/xxx/arthas-agent.jar
该式在用户启动目标jar包的过程中附属 arthas-agent.jar 包,在agentjar包中根据Premain-Class指定的类中premain方法动态修改字节码。
b) 通过 attach方式,在agentjar包中根据Agent-Class指定的类中定义的agentmain方法中作为主入口加载并在运行时【实时】修改字节码。
后面会详细讲解 agent内容
2、模块 - arthas-agent-attach
attach包 使用 ArthasBootstrap启动类【core模块中】,
通过 ArthasBootstrap.getInstance(inst);实例化一个arhtas的启动实例,并bind绑定端口启动一个arthas-server实例。在实例化server的过程中,可以分多个阶段执行。代码分析后续再聊。其功能就是为了隔离生成自己的classLoader,并启动一个一个代理服务【agent server】,代理服务目前划分了三种类型
1)HttpTelnetTermServer
2)HttpTermServer
这两个服务,根据用户的配置自动生成,并通过shell窗口界面与其进行交互。server把用户的执行操作,通过attach远程方式直接与被监控的java 虚拟机进行交互。后面用几章节去研究探讨一下。
3、模块 arthas-spring-boot-starter
顾名思义,就是一个springboot项目的starter,可以方便地继承进spring boot 项目,在依赖了该项目之后会自动在后端启动一个
ArthasAgent,参考一下自动配置类ArthasConfiguration
4、模块 arthas-vmtool
如果读者使用过arthas ,那么想必对arthas 中的 vmtool 命令行操作还是比较深刻的吧。她能帮我们分析被检测jvm中指定类实例的内存大小以及实例个数。对于如何实现内存统计与计算。也可以通过该模块进行深入探索和学习。先透露一点点,其原理是使用native api写的。如果要啃下这块骨头,那么就需要有c语言基础。看不懂的跑跑几个用例就行。代码在VmToolTest中。
这里根据VmToolMXBean接口,我们可以总结出vmtool的几个功能
a) forceGc 强制gc,源码中也给出了jvmti工具中强制gc的来源https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
b)getInstances(Class klass); 给定指定的class,返回对应的实例。
getInstances(Class klass, int limit); 可能实例太多,比如String.class ,用户可以自定义限制数量。
c) sumInstanceSize: 统计某个class在jvm中当前所有存活实例的总占用内存,单位:Byte
d)getInstanceSize(Object instance); 获取某个实例的占用内存,单位:Byte
e)getAllLoadedClasses() 获取所有已加载的类
这里有个疑问,在哪个领域利用了vmtool,通过调用链发现ProfilerCommand、VmToolCommand 使用了vmtool,通过命名我们很容易发现,作者使用了命令模式。该模式常常用于根据用户的输入来执行相关的操作【action/handler】。后面会单独讲解,各种命令的操作。
5、模块 boot
待写
6、core
待写
7、其他
这里是指在arthas核心功能的外围封装的让用户使用起来更加方便的模块。这些模块并不影响核心模块的,只是在核心之上更多元化,满足用户的各种应用层面上的需求,比如弄个web界面,比命令行使用起来更方便。