当前位置:   article > 正文

阿里监控诊断工具 Arthas 源码原理分析_sun.misc.proxygenerator 阿里 arthas 源码

sun.misc.proxygenerator 阿里 arthas 源码

上个月,阿里开源了监控与诊断工具 「Arthas」,一款可用于线上问题分析的利器,短期之内收获了大量关注,在 Twitter 上连 Java 官方的 Twitter 也转发了,真的很赞。

GitHub 上是这样自述的:

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

我一般看到感兴趣的开源工具,会找几个最感兴趣的功能点切入,从源码了解设计与实现原理。对于一些自己了解的实现思路,再从源码中验证一下是否是采用相同的实现思路。如果实现和自己想的一样,可能你会想,啊哈,想到一块了。如果源码中是另一种实现,你就会想 Cool, 还可以这样玩。仿佛如同在和源码的作者对话一样

这次趁着国庆假期看了一些「Arthas」的源码,大致总结下。

从源码的包结构上,可以看到分为几个大的 模块:

  • Agent       -- VM 加载的自定义 Agent

  • Client       -- Telnet 客户端实现

  • Core        -- Arthas 核心实现,包含连接 VM, 解析各类命令等

  • Site          -- Arthas 的帮助手册站点内容

我主要看了以下几个功能:

  • 连接进程

  • 反编译class,获取源码

  • 查询指定加载的 class

连接进程

连接到指定的进程,是后续监控与诊断的基础。只有先 attach 到进程之上,才能获取 VM 对应的信息,查询 ClassLoader 加载的类等等。

怎样连接到进程呢?
用于类似诊断工具的读者可能都有印象,像 JProfile、 VisualVM 等工具,都会让你选择一个要连接到的进程。然后再在指定的 VM 上进行操作。比如查看对应的内存分区信息,内存垃圾收集信息,执行 BTrace脚本等等。

咱们先来想想,这些可供连接的进程列表,是怎么列出来的呢?
一般可能会是类似 ps aux | grep java 这种,或者是使用 Java 提供的工具 jps -lv 都可以列出包含进程id的内容。我在很早之前的文章里写过一点 jps 的内容(你可能不知道的几个java小工具),其背后实现,是会将本地启动的所有 Java 进程,以 pid 做为文件名存放在Java 的临时目录中。这个列表,遍历这些文件即可得出来。

Arthas 是怎么做的呢?
在启动脚本 as.sh 中,有关于进程列表的代码如下,实现也是通过jps 然后把Jps自己排除掉:

  1. # check pid
  2.     if [ -z ${TARGET_PID} ] && [ ${BATCH_MODE} = false ]; then
  3.         local IFS_backup=$IFS
  4.         IFS=$'\n'
  5.         CANDIDATES=($(${JAVA_HOME}/bin/jps -l | grep -v sun.tools.jps.Jps | awk '{print $0}'))
  6.         if [ ${#CANDIDATES[@]} -eq 0 ]; then
  7.             echo "Error: no available java process to attach."
  8.             # recover IFS
  9.             IFS=$IFS_backup
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/995024
推荐阅读
相关标签
  

闽ICP备14008679号