通过 Cloud Toolkit 实现 Arthas 一键远程诊断Cloud Toolkit 是阿里云发布的免费本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且还内置了 Arthas 诊断、Dubbo工具、Terminal 终端、文件上传、函数计算 和 MySQL 执行器等工具。不仅仅有 IntelliJ IDEA 主流版本,还有 Eclipse、Pycharm、Maven 等其他版本。

  • 推荐使用 IDEA 插件下载 Cloud Toolkit 来使用 Arthas:下载链接

1.cpu占比是如何统计出来的?cpu使用率是如何统计出来的?

  • 这里的cpu使用率与linux 命令top -H -p  的线程%CPU类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。
  • 工作原理说明:
  • 首先第一次采样,获取所有线程的CPU时间(调用的是java.lang.management.ThreadMXBean#getThreadCpuTime()及sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()接口)
  • 然后睡眠等待一个间隔时间(默认为200ms,可以通过-i指定间隔时间)
  • 再次第二次采样,获取所有线程的CPU时间,对比两次采样数据,计算出每个线程的增量CPU时间线程
  • CPU使用率 = 线程增量CPU时间 / 采样间隔时间 * 100%
  • 注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。
  • 另外一种查看Java进程的线程cpu使用率方法:可以使用show-busy-java-threads这个脚本

2. 什么是线程cpu增量时间?

  • 线程CPU增量时间应该是单位时间内,该线程占用CPU的时间。

3. JIT编译线程是做什么用的?

  • JIT编译线程: 如 C1 CompilerThread0, C2 CompilerThread0

即时(Just-In-Time)编译器是Java运行时环境的一个组件,它可提高运行时Java应用程序的性能。JVM中没有什么比编译器更能影响性能,而选择编译器是运行Java应用程序时做出的首要决定之一,无论您是Java开发人员还是最终用户。

  • Java功能“一次编译,到处运行”的关键是 bytecode。字节码转换为应用程序的机器指令的方式对应用程序的速度有很大的影响。这些字节码可以被解释,编译为本地代码,或者直接在指令集架构中符合字节码规范的处理器上执行。
  • JIT编译器在运行时与JVM交互,并将适当的字节码序列编译为本地机器代码。使用JIT编译器时,硬件可以执行本机代码,而不是让JVM重复解释相同的字节码序列,并导致翻译过程相对冗长。这样可以提高执行速度,除非方法执行频率较低。
  • JIT编译器编译字节码所花费的时间被添加到总体执行时间中,并且如果不频繁调用JIT编译的方法,则可能导致执行时间比用于执行字节码的解释器更长。当将字节码编译为本地代码时,JIT编译器会执行某些优化。由于JIT编译器将一系列字节码转换为本机指令,因此它可以执行一些简单的优化。
  • JIT编译器执行的一些常见优化操作包括数据分析,从堆栈操作到寄存器操作的转换,通过寄存器分配减少内存访问,消除常见子表达式等。JIT编译器进行的优化程度越高,在执行阶段花费的时间越多。因此,JIT编译器无法承担所有静态编译器所做的优化,这不仅是因为增加了执行时间的开销,而且还因为它只对程序进行了限制。