当前位置: 首页 > news >正文

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

相关文章:

  • HTML5 <abbr> 标签 和 HTML5 <applet> 标签
  • C++面向对象高级编程(上)
  • 安装和配置 Flask
  • Java --- 继承
  • Rabbitmq了解
  • 51单片机-LED篇
  • ThreeJS-3D引擎渲染从入门到入土 搞定前端前沿技术
  • chatGPT 会给程序员带来失业潮吗?
  • 2023美赛春季赛F题思路数据代码论文分享
  • 快速搭建python爬虫管理平台
  • 从 JDK 9 到 19,认识一个新的 Java 形态(内存篇)
  • Dell CentOS 环境下安装远程管理命令racadm
  • Java设计模式-4、适配器模式
  • VUE3项目实现动态路由demo
  • 训练自己的GPT2-Chinese模型
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CentOS从零开始部署Nodejs项目
  • jQuery(一)
  • k8s 面向应用开发者的基础命令
  • Linux链接文件
  • Mysql数据库的条件查询语句
  • mysql外键的使用
  • node和express搭建代理服务器(源码)
  • Python学习之路13-记分
  • 搭建gitbook 和 访问权限认证
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 详解NodeJs流之一
  • 写给高年级小学生看的《Bash 指南》
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 字符串匹配基础上
  • #etcd#安装时出错
  • #HarmonyOS:Web组件的使用
  • #QT(智能家居界面-界面切换)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (二)springcloud实战之config配置中心
  • (正则)提取页面里的img标签
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net反编译工具
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • ??在JSP中,java和JavaScript如何交互?
  • @JsonSerialize注解的使用
  • [<死锁专题>]
  • [20190416]完善shared latch测试脚本2.txt
  • [BUUCTF]-Reverse:reverse3解析
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [linux学习]apt-get参数解析
  • [MySQL]数据库基础
  • [office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法
  • [Oh My C++ Diary]头文件使用之math.h与cmath
  • [rancher] rancher部署和使用的一些思考
  • [Unity3D]深度相机 Depth Camera
  • [VSCode] 你需要知道的23个实用VSCode快捷键