性能诊断零星知识点

  1. 火焰图既是一个开源工具,也是一种类型的图片。作为一个二维图片,火焰图的X轴代表采样总量,而Y轴代表栈深度。每个框就代表了一个栈里的函数,其宽度代表了所占用的CPU总时间。因此,比较宽的框就表示该函数运行时间较慢或被调用次数较多,从而占用的CPU时间多。通过火焰图,相关设计或分析人员就可以轻松观察到各个应用占用CPU的情况。

    参考:CPU Flame Graphs

  1. 在Java环境中,一共有两种类型的堆栈轨迹采样分析器——系统分析器(System Profiler)和JVM分析器(JVM Profiler)。

    前者(如Linux的Perf Events)可以分析系统代码路径,包括libjvm internal、GC和内核,但并不能分析Java方法

    后者(如HPROF、轻量级Java分析器和其他商业分析器)可以显示Java方法,但不能显示系统代码(Java native code)路径。由此可见,这两种方法都不能同时支持系统代码路径和Java方法的堆栈轨迹。

  2. Brendan曾经对系统分析器不能显示Java方法的原因进行分析。这包括两个方面——JVM编译方法时比较快,没有为系统分析器暴露一个符号表;JVM采用x86上的frame pointer作为一个通用寄存器,破坏了传统的stack walking。那么,解决之前的问题,就需要分别从这两个方面入手。对于第一个方面,Java和Linux系统的分析器进行了双方面的努力。

    首先,Java开始支持利用开源的JVMTI代理perf-map-agent来创建perf-PID.map文本文件。该文件列举了16进制的符号地址、大小以及符号名称。然后,从2009年以后,Linux中的Perf_events工具添加了对JIT符号的支持。该工具会检查/tmp/perf-PID.map文件,从而完成对来自语言虚拟机的符号进行检查。

    对于第二个方面,JVM添加了一个新的选项-XX:+PreserveFramePointer。经过Zoltán、Oracle和其他工程师的努力,最新的JDK9和JDK8已经增加了该选项,从而保存了stack walking。需要注意的是:

    • -XX:+PreserveFramePointer 只在 JDK 1.8u60 及之后的版本中支持;
    • -XX:+PreserveFramePointer会增加10%的系统开销(overhead);
---(完)---
Yves wechat
扫一扫互相关注吧~

扫一扫关注公众号