目录

  • arthas是什么?他能帮我们做什么?
  • arthas使用举例
  • arthas 实现这些功能的原理分析

arthas是什么?他能帮我们做什么?

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

arthas使用举例

参考arthas wiki

arthas 实现这些功能的原理分析

arthas对jvm中的一些状态进行监控以及观察进程中执行的方法主要依赖底层JVM提供的JVM TI机制,JVMTI全称 JVM Tool Interface是 JVM 暴露出来的一些供用户扩展的接口集合。

在JAVA开发中java.lang.instrument.Instrumentation作为JVMTI的一个java语言的抽象。通过调用Instrumentation的方法来完成JVM TI提供给我们的能力。而Instrumentation的实例,只有通过javaagent的方式才能够提供给我们的程序。他们的大致关系如下图所示:

简单说明一下Instrumentation中的提供的能力说明:

public interface Instrumentation {/*** 注册一个Transformer,从此之后的类加载都会被Transformer拦截。* Transformer可以直接对类的字节码byte[]进行修改*/void addTransformer(ClassFileTransformer transformer);/*** 对JVM已经加载的类重新触发类加载。使用的就是上面注册的Transformer。* retransformation可以修改方法体,但是不能变更方法签名、增加和删除方法/类的成员属性*/void retransformClasses(Class<?>... classes) throws UnmodifiableClassException;/*** 获取一个对象的大小*/long getObjectSize(Object objectToSize);/*** 将一个jar加入到bootstrap classloader的 classpath里*/void appendToBootstrapClassLoaderSearch(JarFile jarfile);/*** 获取当前被JVM加载的所有类对象*/Class[] getAllLoadedClasses();
}

1.javaagent的类中要实现agentmain方法,如下面代码所示:

public class XXX{//JVM TI加载后会调用该方法public static void agentmain(String args, Instrumentation inst){}
}

2.jar中的MANIFEST.MF中需要指明agent-class及其他的参数

如can-redefine-classes、can-retransform-classes。jar包封装好后,我们就可以通过attach api将我们能够依附到某个进程中,下面截图展示了arthas如何依附进程,依附完成后,如何将将agent jar加载到jvm中。

我们以arthas的Watch命令为例子,分析下代码中的实现

  • 将AgentBootstrap加载到jvm中

    对应会调用AgentBootstrap中的main方法。main方法中主要实现了:
  • 用bootstrapClassLoader类加载器加载arthas-spy.jar,后续的方法加强会使用到spy中的逻辑
  • 启动了监听命令的server

    最后使用asm代码增强并调用Instrumentation的retransformClasses来替换内存中正在执行的字节码。替换完成后,在finally中调用removeTransformer来取消代码替换。在下次重启时,内存中的字节码会恢复。

    整体的调用流程如下图所示:

参考资料:
https://lijiankun24.com/%E8%AE%A4%E8%AF%86-class-%E6%96%87%E4%BB%B6%E7%9A%84%E5%AD%97%E8%8A%82%E7%A0%81%E7%BB%93%E6%9E%84/
http://tech.dianwoda.com/author/li-cheng-kai/
http://www.fanyilun.me/2017/07/18/%E8%B0%88%E8%B0%88Java%20Intrumentation%E5%92%8C%E7%9B%B8%E5%85%B3%E5%BA%94%E7%94%A8/

arthas 运维工具介绍与原理分析相关推荐

  1. iis日志字段解析 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)

    网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置) https://www.cnblogs.com/fuqiang88/p/5870306.html 我们只能通过各种系统日志来分析网 ...

  2. Ansible自动化运维工具介绍与部署

    ansible自动化运维工具介绍与部署 文章目录 一.什么是自动化运维? 二.常用的自动化运维工具 2.1 Ansible 2.2 SaltStack 2.3 Puppet 2.4 三种自动化工具特点 ...

  3. 常见的自动化运维工具介绍及特点、安装ansible

    常见的自动化运维工具介绍及特点.安装ansible 一.什么是自动化运维? 简单来说,自动化运维就是将日常重复性工作按照事先设定好的规则,在一定时间范围内自动化运行,而不需要人为参与. 将周期性.重复 ...

  4. Ansible自动化运维工具介绍

    介绍 Ansible自动化运维工具,是基于Python开发的,可以实现批量系统配置,批量程序部署.批量运行命令等等. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ans ...

  5. IT自动化运维工具优势与劣势分析-行云管家

    随着自动化技术的进步,目前市面上出现了不少IT自动化运维工具.但很多人对于IT自动化运维工具优劣势不是很清楚,这里我们就来一起简单分析分析. IT自动化运维工具优势 1.提高IT运维工作人员工作效率, ...

  6. ansible运维工具介绍

    运维工具: OS Provisioning:PXE,Cobbler(repository.distributioprofile) PXE:dhcp.tftp.dnsmap.dns OS Config: ...

  7. 运维工具介绍——ansible

    企业自动化运维工具--ansible 运维管理有公司内部的"IT运维",以及网站运维. ansible是新出现的自动化运维工具,它是基于Python开发的.ansible基于par ...

  8. 猿创征文|运维工具介绍

    1:Zabbix 现在企业是"无监控,不运维",在企业中没有监控手段是无法想象的.Zabbix是一个基于WEB界面的提供分布式系统监控以及网络监视功能的企业级的开源解决方案.zab ...

  9. 自动化运维工具ansible(安装与模块介绍)

    自动化运维工具ansible(安装与模块介绍) 一.ansible运维工具概述 (一).ansible的特点 (二).ansible的原理 (三)ansible的优点 二.安装ansible 三.an ...

最新文章

  1. 下列属于PHP的数据类型的是,中国大学MOOC: 下列不属于PHP数据类型的是( )。...
  2. Docker最全教程——数据库容器化之持久保存数据(十一)
  3. Flask知识点回顾以及重点内容
  4. SQL 审核系统体验
  5. context:component-scan扫描使用上的容易忽略的use-default-filters
  6. php---header函数的示例代码
  7. 【转】SQL SERVER 获取存储过程返回值
  8. ipmitool查看内存信息_小技巧:Win7系统中查看电脑内存频率多少的方法
  9. [笔记]C++代码演示SingletonMap 单类Map实例
  10. 图像旋转(任意角度)matlab
  11. 基于python的学生管理系统的设计开题报告_学生信息管理系统设计开题报告
  12. java markdown 转 pdf_markdown转为pdf文件
  13. python文档字符串和注释的区别,加载模块时,Python文档字符串和注释是否存储在内存中?...
  14. 移动硬盘数据错误循环冗余检查,要怎么恢复资料
  15. 飞思卡尔16位单片机(十四)—— CAN总线模块测试
  16. 跨专业考浙大计算机考研难度,0基础跨专业计算机考研经验-2013浙大
  17. 公司建网站多少钱?【网站多少钱】
  18. 学习记录:RGBA格式数据加边框
  19. 类的不同实例化使用一张虚函数表
  20. 建筑力学与结构【14】

热门文章

  1. 16进制转Base64的实现原理及代码
  2. Renamer for Mac 6.0.6批量重命名文件。
  3. 带有响应式网页设计的MEAN和UGLI CRUD
  4. MVC的Model层验证(非空,手机号验证)
  5. layuiAdmin pro v1.x 【单页版】开发者文档
  6. 计算机毕业设计Java农业信息化服务平台(源码+系统+mysql数据库+lw文档)
  7. 为什么我们不再 Root 和刷机了?
  8. Win10系统USB供电不足?USB一长就掉线,可以试试“取消允许计算机关闭此设备以节约电源”
  9. 让cocos2dx 支持Staggered格式的tmx
  10. 前端架构之一浅谈前后端分离