arthas 源码分析 篇一 【结构篇】

框架

前期准备

1、 github源码地址
1.1、 官方文档
2、 下载下来 idea打开。
3、选择idea build操作。如果出现cannot resolve symbol。需要重新建立索引
file
重建索引资料点击查看

此时就可以看到正常的项目

file

模块 - 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界面,比命令行使用起来更方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值