关于arthas调研

Arthas介绍
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
运行原理:
关于arthas调研
文章图片
image 命令列表:
关于arthas调研
文章图片
image 链接:https://github.com/alibaba/arthas/blob/master/README_CN.md
预备知识
什么是JVMTI JVMTI 的全称是 JVM Tools Interface,是Java虚拟机提供的一整套后门。通过这套后门可以对虚拟机方方面面进行监控,分析,甚至干预虚拟机的运行。JVMTI 本质上是在JVM内部的许多事件进行了埋点。通过这些埋点可以给外部提供当前上下文的一些信息。它是分析工具与调试器的基础。
什么是Instrumentation 虽然java提供了JVMTI,但是对应的agent需要用C/C++开发,对java开发者而言并不是非常友好。因此在Java SE 5的新特性中加入了Instrumentation机制。有了 Instrumentation,开发者可以构建一个基于Java编写的Agent来监控或者操作JVM了,比如替换或者修改某些类的定义等。
JavaAgent 的两种方式 在 Java 中实现Instrumentation有两种方式:在类执行前通过premain来执行 , 或者在启动执行后通过agentMain实现。
  1. premain是在 Java SE 5中新引入的 ,开发者只能在 premain 当中施展想象力,所作的 Instrumentation 也仅限与 main 函数执行前,这样的方式存在一定的局限性。
  2. Java SE 6 针对这种状况做出了改进,开发者可以在 main 函数开始执行以后,再启动自己的 Instrumentation 程序,这种方式通过agentMain。
Java attach 在Java SE 5中是通过指定premain所在的jar来启动虚拟机,而Java SE 6 通过发送命令到目标虚拟机,让目标虚拟机再load jar,那么这个过程比如涉及到虚拟机之间的通信。Java SE 6 就是通过Java attach 来实现两个主机之间的通信的。
ASM / Java assist Java是软件开发人员能读懂的语言,class字节码是JVM能读懂的语言,class字节码最终会被JVM解释成机器能读懂的语言。无论哪种语言,都是人创造的。所以,理论上(实际上也确实如此)人能读懂上述任何一种语言,既然能读懂,自然能修改。只要我们愿意,我们完全可以跳过Java编译器,直接写字节码文件,只不过这并不符合时代的发展罢了,毕竟高级语言设计之始就是为我们人类所服务,其开发效率也比机器语言高很多。
对于人类来说,字节码文件的可读性远远没有Java代码高。尽管如此,还是有一些杰出的程序员们创造出了可以用来直接编辑字节码的框架,提供接口可以让我们方便地操作字节码文件,进行注入修改类的方法,动态创造一个新的类等等操作。其中最著名的框架应该就是ASM了,cglib、Spring等框架中对于字节码的操作就建立在ASM之上。
ASM 简单的说,ASM 可以读取解析class文件内容,并提供接口让你可以对class文件字节码内容进行CRUD操作。https://www.jianshu.com/p/a85e8f83fa14
字节码初探 1 https://www.cnblogs.com/royi123/p/3569511.html
2 https://www.jianshu.com/p/9f09a0c21542
基于栈的Hotspot的执行过程如下:

关于arthas调研
文章图片
image 动图链接: https://images.cnblogs.com/cnblogs_com/royi123/548096/o_609956274533007378.gif
java探针
其实就是javaagent,借助jvmti机制与客户jar包一起部署上线,采集性能数据发送到数据中心。数据中心提供可视化界面直观展现给客户,帮助定位性能问题。
探针客户端技术栈比较窄:
1、jvmti
2、字节码编辑【asm或者byte-buddy(https://github.com/apache/skywalking)】
3、classloader类加载机制
4、多线程
学习demo: https://github.com/CallMeJiaGu/iarthas
【关于arthas调研】https://github.com/cderlearner/arthas-learning

    推荐阅读