概述

从实践的角度去认识虚拟机内存管理的世界
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
数据不限于异常堆栈、虚拟机运行日志、垃圾收集器日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)

故障处理工具

JDK的bin目录下的工具
image.png
除了编译和运行Java程序外还有打包、部署、签名、调试、监控、运维等

工具分类

故障处理工具根据软件可用性和授权的不同,可分为3类

  • 商业授权工具
    JMC及它使用到的JFR。JDK11之前都无需独立下载,但是在商业环境中使用则要付费,个人开发环境中是免费的
  • 正式支持工具
    长期被支持的工具,不同平台、版本可能会有差异,但不会突然消失
  • 实验性工具
    被声明为没有技术支持,并且是实验性质的产品,可能会在日后转为正式,也可能会消失。但其功能通常非常稳定而且功能强大

工具类和工具模块

这些工具类通常不会太大,只是简单的一层封装,正真的功能代码实现是在JDK的工具类库中的,且还是由Java语言本身实现的

  • 在JDK9模块化改造之后在jmods文件夹中
    image.png
  • 在JDK9之前在lib目录下的tools.jar包中
    image.png

jps:虚拟机进程状况工具

JDK的很多小工具命令都参考了UNIX命令
jps(JAVA Process Status Tool)和shell的ps命令类似
列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)

jps参数

E:\Ideacode\工作workspace\JVM>jps --help
illegal argument: --help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]

usage: jps [-help]
jps [-q] [-mlvV] []

  • -q:只输出LVMID,省略主类的名称
  • -m:输出虚拟机进程启动时传递给主类main()函数的参数
  • -l:输出主类的全名,如果进程执行的是JAR包,则输出JAR路径
  • -v:输出虚拟机进程启动时的JVM参数
    image.png

jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)用于监视虚拟机各种运行状态信息的命令行工具。可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI图形界面、只提供了文本控制台环境的服务器上,是运行期定位虚拟机性能问题的常用工具

jstat参数

invalid argument count
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      An option reported by the -options option
  <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                     <lvmid>[@<hostname>[:<port>]]
                Where <lvmid> is the local vm identifier for the target
                Java virtual machine, typically a process id; <hostname> is
                the name of the host running the target Java virtual machine;
                and <port> is the port number for the rmiregistry on the
                target host. See the jvmstat documentation for a more complete
                description of the Virtual Machine Identifier.
  <lines>       Number of samples between header lines.
  <interval>    Sampling interval. The following forms are allowed:
                    <n>["ms"|"s"]
                Where <n> is an integer and the suffix specifies the units as
                milliseconds("ms") or seconds("s"). The default units are "ms".
  <count>       Number of samples to take before terminating.
  -J<flag>      Pass <flag> directly to the runtime system.

参数interval和count代表查询间隔和次数,如果省略则只查询1次。
option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况
//下面命令代表每250ms查询一次进程为 垃圾收集情况,一共查询20次
jstat -gc 6188 250 20
image.png

  • -class:监视类加载、卸载数量、总空间以及类装装载所耗费的时间
  • -gc:监视Java堆状况、包括Eden区、2个Survivor区、老年代、永久代等的容量,已用空间,垃圾收集时间合计等信息
  • -gccapacity:监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
  • -gcutil:与-gc基本相同,主要关注已经使用空间占总空间的百分比
  • -gcnew:监视新生代垃圾收集状况
  • -gcnewcapacity:与-gcnew基本相同,输出主要关注使用到的最大、最小空间
  • -gcold:监视老年代垃圾收集状况
  • -gcoldcapacity:与-gcold基本相同,输出主要关注使用到的最大、最小空间
  • -gcpermcapacity:输出永久带使用到的最大、最小空间
  • -compiler:输出即时编译器编译过的方法、耗时等信息
  • -printcompilation:输出已经被即时编译的方法

jstat举例

image.png
上图是启动的服务器内存状况
该结果说明:该服务器的新生代(E)使用率从50%~60%多,一直在增长,2个Survivor区(S0、S1),老年代(O)为6%,程序运行以来发生Minor GC(YGC,标识Young GC)5次,耗时0.046秒。发生Full GC(FGC)1次,共耗时0.032秒。所有GC(GTC,GC Time)总耗时0.078秒。

直接在控制台使用jstat命令依然是一种常用的监控方式

jinfo:Java配置信息工具

jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机### 各项参数
jps -v:查看虚拟机启动时显式指定的参数列表,无法查看系统默认值
jinfo -flag:可以查询

Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一班称为heapdump或dump文件)

不使用jmap命令的“暴力”手段

  • -XX:+HeapDumpOnOutOfMemoryError参数,可以在内存溢出异常之后自动生成堆转储快照文件
  • -XX:+HeapDumpOnCtrlBreak参数可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件
  • 在Linux系统下通过kill -3命令发送进程退出信号“恐吓”一下虚拟机,也可以得到堆转储快照

jmap的作用还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器

jmap参数

Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system
  • -dump:生成Java堆转储快照。格式为-dump:[live,]fotmat=b,file=,其中live子参数说明是否只dump出存活的对象
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。在Linux/Solaris平台下有效
  • -heap:显示Java堆详细信息,如使用哪种会后期、参数配置、分代状况等。只在Linux/Solaris平台下有效
  • -histo:显示堆中对象统计信息,包括类、示例数量、合计容量
  • -permstat:以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效
  • -F:当虚拟机进程堆-dump选项没有响应时,可使用该选项强制生成dump快照。只在Linux/Solaris平台下有效

举例

image.png
如上图所示生成LVMID为6196的名为nacos的dump文件
image.png

jhat:虚拟机堆转储快照分析工具

jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析生成的堆转储快照,可在浏览器中查看。但不常用,比较简陋,可以使用Visual VM 和IBM HeapAnalyzer等工具
image.png
如上图,在浏览器输入本地端口7000即可访问
image.png

jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂机等,都是导致线程长时间停顿的常见原因

jstack参数

Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message
  • -F:当正常输出的请求贞响应时,强制输出线程堆栈
  • -l:除堆栈外,显示关于锁的附加信息
  • -m:如果调用到本地方法的话,可以显示C/C++的堆栈

image.png
image.png

getAllStackTrace()方法

用于获取虚拟机中所有线程的StackTraceElement对象。使用该方法可以通过简单的几行代码完成jstack的大部分功能

    public void GetAllStackTrace() {
        for (Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()) {
            Thread thread = (Thread) stackTrace.getKey();
            StackTraceElement[] stack = stackTrace.getValue();
            if (thread.equals(Thread.currentThread())) {
                continue;
            }
            System.out.println("\n线程:" + thread.getName() + "\n");
            for (StackTraceElement element :
                    stack) {
                System.out.println("\t" + element + "\n");
            }
        }
    }

基础工具总结

工具分类:基础工具、安全工具、国际化工具、远程方法调用工具、Java IDL与RMI-IIOP、部署工具、Java Web Start、性能监控和故障处理工具、WebService工具、REPL和脚本工具

基础工具:用于支持基本的程序创建和运行

  • appletviewer:在不使用Web浏览器的情况下运行和调试Applet,JDK11中被移除
  • extcheck:检查JAR冲突的工具,JDK9中被移除
  • jar:创建和管理JAR文件
  • java:Java运行工具,用于运行Class文件或JAR文件
  • javac:用于Java编程语言的编辑器
  • javadoc:Java的API文档生成器
  • javah:C语言头文件和Stub函数生成器,用于编写JNI方法
  • javap:Java字节码分析工具
  • jlink:将Moudle和它的依赖打包成一个运行时镜像文件
  • jdb:基于JPDA协议的调试器,以类似于GDB的方式进行调试Java代码
  • jdeps:Java类依赖性分析器
  • jdeprscan:用于搜索JAR包中使用了“deprecated”的类,从JDK9开始提供

安全工具:用于程序签名、设置安全测试等

  • keytool:管理密钥库和证书
  • jarsigner:生成并验证JAR签名
  • policytool:管理策略文件的GUI工具

国际化工具:用于创建本地语言文件

  • native2ascii:本地编码到ASCII编码的转换器

远程方法调用工具:用于跨Web或网络的服务交互

  • rmic:Java RMI编译器
  • rmiregistry:远程对象注册表服务
  • rmid:启动激活系统守护进程
  • serialver:生成并返回指定类的序列化版本ID

Java IDL与RMI-IIOP

  • tnameserv:提供对命令服务的访问
  • idlj:IDL转Java
  • orbd:对象请求代理守护进程
  • servertool:为应用程序注册、注销、启动和关闭服务器提易用的接口

部署工具:用于程序打包、发布和部署

  • javapackager:打包、签名Java和JavaFX应用程序,在JDK11中被移除
  • pack200:使用Java GZIP压缩器将JAR文件转换为压缩的Pack200文件
  • unpack200:将Pack200生成的打包文件解压提取为JAR文件

Java Web Start

  • javaws:启动Java Web Start并设置各种选项的工具。在JDK11中被移除

性能监控和故障处理工具

  • jps:显示指定系统内所有的HotSpot虚拟机进程
  • jstat:收集HotSpot虚拟机各个方面的运行数据
  • jstatd:jstat的守护程序
  • jinfo:显示虚拟机配置信息,在JDK9中集成到了JHSDB中
  • jmap:生成虚拟机的内存转储快照(heapdump文件)在JDK9中集成到了JHSDB中
  • jhat:分析堆转储快照,在JDK中被JHSDB代替
  • jstack:显示虚拟机的线程快照
  • jhsdb:基础Serviceability Agent的HotSpot进程调试器
  • jsadebugd:Java的可维护性代理调试守护线程,用于附加到指定的Java进程、核心文件,或充当一个调试服务器
  • jcmd:虚拟机诊断命令工具
  • jconsole:监控Java虚拟机的使用JMX规范的图形工具
  • jmc:监控和管理Java应用程序的工具
  • jvisualvm:图形化工具,提供有关于Java技术的应用程序(Java应用程序)的详细信息

WebService:与CORBA一起在JDK11中被移除

  • schemagen:用于XML绑定的Schema生成器
  • wsgen:
  • wsimport:
  • xjc:

REPL和脚本工具

  • jshell:基于Java的Shell REPL交互工具
  • jjs:对Nashorn引擎的调用入口
  • jrunscript:Javaing厉害脚本外壳工具

可视化故障处理工具

JDK中除了附带大量的命令行工具外,还提供了几个功能集成度更高的可视化工具,用户可以使用这些可视化工具以更加便捷的方式进行进程故障诊断和调试工作。
有JConsole、JHSDB、VisualVM和JMC四个。其中JMC在生产环境中使用是收费的

  • JConsole:最古老的虚拟机监控工具,在JDK5中提供
  • JHSDB:JDK9中正式提供,之前以sa-jdi.jar包里的HSDB(可视化工具)、CLHSDB(命令行工具)存在
  • VisualVM:多合一故障处理工具,从OracleJDK中分离出,单独的开源项目,可以免费下载、使用
  • JMC:从JDK11开始被移除出JDK,虽然开源,但JMC需要与HotSpot内部的飞行记录仪(JFR)配合才能工作,JDK11以前,JFR的开启要解锁OracleJDK的商业特性支持,所以在生产环境中仍然是需要付费才能使用的商业特性

JHSDB:基于服务型代理的调试工具

JDK提供了JCMD和JHSDB两个集成式的多功能工具箱。基本整合了所有基础工具所能提供的专项功能

JCMD命令行参数

Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
   or: jcmd -l
   or: jcmd -h

  command must be a valid jcmd command for the selected jvm.
  Use the command "help" to see which commands are available.
  If the pid is 0, commands will be sent to all Java processes.
  The main class argument will be used to match (either partially
  or fully) the class used to start Java.
  If no options are given, lists Java processes (same as -p).

  PerfCounter.print display the counters exposed by this process
  -f  read and execute commands from the file
  -l  list JVM processes on the local machine
  -h  this help

JHSDB图形模式

JHSDB是一款基于服务性代理(Serviceability Agent,SA)实现的进程外调试工具
服务性代理:是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言(含少量JNI代码)实现的API集合
服务性代理以HotSpot内部的数据结构为参照物进行设计,把这些C的数据抽象出Java模型对象,相当于HotSpot的C代码的一个镜像。通过服务性代理的API,可以在一个独立的Java虚拟机的进程里分析其他HotSpot虚拟机的内部数据,或者从HotSpot虚拟机进程内存中dump出来的转储快照里还原出它的运行状态细节

JHSB调试(在JDK11环境下)

  • 测试代码
/**
 * @Author jtao
 * @Date 2021/1/24 15:36
 * @Description     通过JHSDB得到staticObj、instanceObj、localObj对象存放地点位置
 *       64位JHSDB对指针压缩支持存在缺陷,故禁用。为了加快对内存搜索对象速度,限制Java堆内存大小
 *       VM参数:-Xmx10m -XX:+UseSerialGC -XX:-UseCompressedOops
 *
 */

public class JHSDB_TestCase {
    static class Test {
        static ObjectHolder staticObj = new ObjectHolder();
        ObjectHolder instanceObj = new ObjectHolder();

        void foo() {
            ObjectHolder localObj = new ObjectHolder();
            //此处断点调试
            System.out.println("done");
        }
    }

    private static class ObjectHolder {
    }

    public static void main(String[] args) {
        Test test = new JHSDB_TestCase.Test();
        test.foo();
    }
}
  • 对象放入地址:
    staticObj:Test类型信息存放在方法区
    instanceObj:Test的对象示例存放在Java堆
    localObj:存放在foo()方法栈帧的局部变量表中
    image.png

  • 使用命令行打开JHSB
    C:\Java\jdk-11.0.4\bin>jhsdb hsdb --pid 14712
    image.png

  • 使用Windows->Console->scanoops
    image.png
    scanoops 0x000001ba7a000000 0x000001ba7a300000
    image.png
    可知其内存地址位Eden范围内

  • 使用Tools->Inspector
    image.png
    //TODO

JConsole:Java监视与管理控制台

JConsole(Java Monitoring and Management Console)是基于JMX(Java Management Extensions)的可视化监视、管理工具。
通过JMX的MBean(Managed Bean)对系统进行信息收集和参数动态调整
JMX是一种开放性的技术,不仅可以用在虚拟机本身的管理上,还可以运行于虚拟机之上的软件中

启动JConsole

  • cmd启动或者直接运行jconsole.exe。
    image.png
  • 其会自动搜索出本机运行的所有虚拟机进程,不需要用户自己使用jps查询。JMX支持跨服务器的管理,也可以使用“远程进程”功能来连接远程服务器,对远程虚拟机进程监控
    image.png
  • 进入nacos的虚拟机进程
    主界面包括:概述、内存、线程、类、VM摘要、MBean六个页标签
    image.png-

概述

显示整个虚拟机主要运行数据的概览信息,包括堆内存使用情况、线程、类、CPU使用情况四项信息的曲线图,是后面内存、线程、类页签的信息汇总
image.png

内存监控

内存页签的作用相当于可视化的jstat命令,用于监视被收集器管理的虚拟机内存(被收集器直接管理的Java堆和被间接管理的方法区)的变化趋势
image.png

线程监控

线程页签的功能相当于可视化的jstack命令,遇到线程停顿的时候可以使用该页签进行分析。
线程长时间停顿的主要原因有等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待

  • 代码资源
/**
 * @Author jtao
 * @Date 2021/1/24 17:43
 * @Description 线程等待演示代码
 */

public class JConsole {
    //线程死循环演示
    public static void creatBusyThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) ;
            }
        },"testBusyThread");
        thread.start();
    }

    //线程锁等待演示
    public static void creatLockThread(final Object lock){
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"testLockThread");
        thread.start();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        creatBusyThread();
        br.readLine();
        Object obj=new Object();
        creatLockThread(obj);
    }
}

VisualVM:多合一故障处理工具

VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一。
除了常规的运行监视、故障处理外,还将提供其他方面的能力,如性能分析(Profiling)
相比较于JProfiler、TourKit等专业收费的Profiling工具,其通用性很强,对应用程序实际性能的影响也较小,使得可以直接应用在生产环境中

VisualVM兼容范围于插件安装

VisualVM基于NetBeans平台开发工具,具备通过插件扩展功能的能力

  • VisualVM的作用:
    1.显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
    2.监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)
    3.dump以及分析堆转储快照(jmap、jhat)
    4.方法及的程序运行性能分析,找出被调用最多、运行时间最长的方法
    5.离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照
    6.其他插件带来的无限可能性

  • VisualVM安装
    开源项目地址:http://visualvm.github.io/ 进行下载,或者JDK9之前安装的应用程序
    image.png

  • VisualVM插件

  • 可以手工安装
    http://visualvm.github.io/plugins.html下载安装

  • 自动安装
    工具->插件菜单
    image.png
    网络有问题,还是通过手工安装

image.png
VisualVM中概述、监视、线程、MBeans的功能于JConsole差别不大

生成、浏览转储快照

分析程序性能

VisualVM提供了程序运行期间方法级的处理器执行时间分歧以及内存分析

BTrace动态日志跟踪

Java Mission Control:可持续在线的监控工具

除了技术支持以及可以为企业专门定制安装包这些非技术类的增强服务外,与其他不收费的区别在于包含了一系列的监控、管理工具,如用于企业JRE定制管理的AMC控制台、JUT跟踪系统,用于持续收集数据的JFR飞行记录仪和用于监控Java虚拟机的JMC(Java Mission Control)。这些功能全部都是需要商业授权才能在生产环境中使用,个人开发环境中,允许免费使用JMC和JFR

JFR

JFR是一套内建在HotSpot虚拟机里面的监控和基于事件的信息搜集框架,-- - Oracle强调其可持续在线的特性

  • 在生产环境中对吞吐量的影响不会高于1%
  • 其监控过程开始、停止都为动态,不需要重启应用
  • 不需要对应用程序的源码做任何修改
  • 不需要特定代理来运行

运行JMC

image.png
JMC与虚拟机之间同样采取JMX协议进行通信
JMC一方面作为JMX控制台,显示来自虚拟机MBean提供的数据;
另一方面作为JFR的分析工具,展示来自JFR的数据
image.png
image.png

远程连接JMC

文件->连接 菜单中创建远程连接
image.png

MBean和JFR两个数据来源

MBean

与JConsole和VisualVM取到的内容是一样的,只是展示形式有区别

JFR数据记录

image.png
上图显示未开启飞行参数JVM。重新启动加入JVM参数 -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
image.png
image.png
image.png
在启动飞行记录时,可以进行记录时间、垃圾收集器、编译器、方法采样、县城记录、异常记录、网络和文件I/O、时间记录等选项和频率设定。
点击完成按钮后马上就会开始记录,记录时间结束以后会生成飞行记录报告

JFR飞行记录报告信息

  • 一般信息:关于虚拟机、操作系统和记录的一般信息
  • 内存:关于内存管理和垃圾收集的信息
  • 代码:关于方法、异常错误、编译和类加载的信息
  • 线程:关于应用程序中线程和锁的信息
  • I/O:关于文件和套接字输入、输出的信息
  • 系统:关于正在运行Java虚拟机的系统、进程和环境变量的信息
  • 事件:关于记录中的事件类型的信息,可以根据线程或堆栈跟踪,按照日志或图形的格式查看

JFR工作逻辑

JFR的基本工作逻辑是开启一系列事件的录制动作,当某个事件发生时,这个事件的所有上下文数据将会以循环日志的形式被保存至内存或者指定的某个文件当中,循环日志相当于数据流被保留在一个环形缓存中,所以只有最近发生的事件的数据才是可用的。
JMC从虚拟机内存或者文件中读取并展示这些事件数据,并通过这些数据进行性能分析

JFR提供的数据质量通常要比其他工具通过代理形式采样获得或者从MBean中取得的数据高得多

HotSpot虚拟机插件及工具

HotSpot虚拟机的插件和辅助工具存放在HotSpot源码hotspot/src/share/tools目录下,包括曾经有但新版本被移除的

  • Ideal Grahp Visualizer:可视化展示C2即时编译器如何将字节码转化为理想图,然后转化为字节码的
  • Client Compiler Visualizer:查看C1即时编译器生成高级中间表示(HIR),转换成低级中间表示(LIR)和做物理寄存器分配的过程
  • MakeDeps:帮助处理HotSpot的编译依赖的工具
  • Project Creator:帮忙生成Visual Studio的.project文件的工具
  • LogCompilation:将-XX:+LogCompilation输出的日志整理成更容易阅读的格式的工具
  • HSDIS:即时编译器的反汇编插件

HSDIS:JIT生成代码反汇编

HSDIS是一个被官方推荐的HotSpot虚拟机即时编译代码的反汇编插件,包含在HotSpot虚拟机的源码当中
//TODO


这个家伙很懒,啥也没有留下😋