文章目录

  • 前言
  • 一、JMC介绍
  • 二、JFR数据记录
  • 结尾

前言

Java Mission Control,曾经是大名鼎鼎的来自BEA公司的图形化诊断工具,随着BEA公司被Oracle收购,它便被融合进OracleJDK之中。在JDK 7 Update 40时开始随JDK一起发布,后来Java SE Advanced产品线建立, Oracle明确区分了Oracle OpenJDK和OracleJDK的差别, JMC从JDK 11开始又被移除出JDK。虽然在2018年Oracle将JMC开源并交付给OpenJDK组织进行管理,但开源并不意味着免费使用, JMC需要与HotSpot内部的“飞行记录仪”(Java Flight Recorder, JFR)配合才能工作,而在JDK 11以前, JFR的开启必须解锁OracleJDK的商业特性支持(使用JCMD的VM.unlock_commercial_features或启动时加入-XX: +UnlockCommercialFeatures参数),所以这项功能在生产环境中仍然是需要付费才能使用的商业特性。


一、JMC介绍

除了大家熟知的面向通用计算(General Purpose Computing)可免费使用的Java SE外,Oracle公司还开辟过带商业技术支持的Oracle Java SE Support和面向独立软件供应商(ISV)的Oracle Java SE Advanced & Suite产品线。

除去带有7×24小时的技术支持以及可以为企业专门定制安装包这些非技术类的增强服务外,Oracle Java SE Advanced & Suite与普通Oracle Java SE在功能上的主要差别是前者包含了一系列的监控、管理工具,例如用于企业JRE定制管理的AMC(Java Advanced Management Console)控制台、JUT(Java Usage Tracker)跟踪系统,用于持续收集数据的JFR(Java Flight Recorder)飞行记录仪和用于监控Java虚拟机的JMC(Java Mission Control)。这些功能全部都是需要商业授权才能在生产环境中使用,但根据Oracle Binary Code协议,在个人开发环境中,允许免费使用JMC和JFR,本节笔者将简要介绍它们的原理和使用。

JFR是一套内建在HotSpot虚拟机里面的监控和基于事件的信息搜集框架,与其他的监控工具(如JProfiling)相比,Oracle特别强调它“可持续在线”(Always-On)的特性。JFR在生产环境中对吞吐量的影响一般不会高于1%(甚至号称是Zero Performance Overhead),而且JFR监控过程的开始、停止都是完全可动态的,即不需要重启应用。JFR的监控对应用也是完全透明的,即不需要对应用程序的源码做任何修改,或者基于特定的代理来运行。

JMC最初是BEA公司的产品,因此并没有像VisualVM那样一开始就基于自家的Net-Beans平台来开发,而是选择了由IBM捐赠的Eclipse RCP作为基础框架,现在的JMC不仅可以下载到独立程序,更常见的是作为Eclipse的插件来使用。JMC与虚拟机之间同样采取JMX协议进行通信,JMC一方面作为JMX控制台,显示来自虚拟机MBean提供的数据;另一方面作为JFR的分析工具,展示来自JFR的数据。启动后JMC的主界面如图所示。


在左侧的“JVM浏览器”面板中自动显示了通过JDP协议(Java Discovery Protocol)找到的本机正在运行的HotSpot虚拟机进程,如果需要监控其他服务器上的虚拟机,可在“文件->连接”菜单中创建远程连接,如图所示。


这里要填写的信息应该在被监控虚拟机进程启动的时候以虚拟机参数的形式指定,以下是一份被监控端的启动参数样例:

-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.31.4
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

本地虚拟机与远程虚拟机进程的差别只限于创建连接这个步骤,连接成功创建以后的操作就是完全一样的了。把“JVM浏览器”面板中的进程展开后,可以看到每个进程的数据都有MBean和JFR两个数据来源。关于MBean这部分数据,与JConsole和VisualVM上取到的内容是一样的,只是展示形式上有些差别,就不再重复了,后面着重介绍JFR的数据记录。


二、JFR数据记录

双击“飞行记录器”,将会出现“启动飞行记录”窗口(如果第一次使用,还会收到解锁商业功能的警告窗),如图所示。


在启动飞行记录时,可以进行记录时间、垃圾收集器、编译器、方法采样、线程记录、异常记录、网络和文件I/O、事件记录等选项和频率设定,这部分比较琐碎,笔者就不一一截图讲解了。点击“完成”按钮后马上就会开始记录,记录时间结束以后会生成飞行记录报告,如图所示。

飞行记录报告里包含以下几类信息:

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

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

即使不考虑对被测试程序性能影响方面的优势,JFR提供的数据质量通常也要比其他工具通过代理形式采样获得或者从MBean中取得的数据高得多。以垃圾搜集为例,HotSpot的MBean中一般有各个分代大小、收集次数、时间、占用率等数据(根据收集器不同有所差别),这些都属于“结果”类的信息,而JFR中还可以看到内存中这段时间分配了哪些对象、哪些在TLAB中(或外部)分配、分配速率和压力大小如何、分配归属的线程、收集时对象分代晋升的情况等,这些就是属于“过程”类的信息,对排查问题的价值是难以估量的。


结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步

深入理解java虚拟机(十三)Java Mission Control:可持续在线的监控工具相关推荐

  1. 《深入理解Java虚拟机》Java内存区域与内存溢出异常

    <深入理解Java虚拟机>Java内存区域与内存溢出异常 参考文章: (1)<深入理解Java虚拟机>Java内存区域与内存溢出异常 (2)https://www.cnblog ...

  2. 深入理解Java虚拟机-走近Java

    本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...

  3. 深入理解 Java 虚拟机——走近 Java

    1.1 - 概述 Java 总述:Java 不仅是一门编程语言,还是一个由一系列 计算机软件 和 规范 形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...

  4. Java虚拟机 和 java虚拟机下的进程

    一.什么是Java虚拟机      当你谈到Java虚拟机时,你可能是指:      1.抽象的Java虚拟机规范      2.一个具体的Java虚拟机实现      3.一个运行的Java虚拟机实 ...

  5. java虚拟机原理(java虚拟机的基本结构)

    虚拟机的分类 虚拟机大体上分为系统虚拟机和程序虚拟机: 如:大名鼎鼎的VMware就属于系统虚拟机,VMware是完全对物理计算机的仿真,提供一个可以运行完整操作系统的软件平台: 程序虚拟机的代表就是 ...

  6. Java虚拟机规范 Java SE 8版 - class文件格式(二)

    Java虚拟机规范 Java SE 8版 - class文件格式(二) 4.5 字段 4.6 方法 4.7 属性 4.7.1 自定义和命名新的属性 4.7.2 ConstantValue 属性 4.7 ...

  7. [Java学习探讨]为什么学Java虚拟机的Java程序员更有价值?

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 [Java学习探讨]为什么学Java虚拟机的Java程序员更值钱? 曾经的我经常害怕处理与JVM相关的异常,对JVM的配置参数也一无 ...

  8. Java虚拟机规范 Java SE 8版 - class文件格式(一)

    Java虚拟机规范 Java SE 8版 - class文件格式(一) 4.1 ClassFile 结构 4.2 各种名称的内部表示形式 4.2.1 类和接口的二进制名称 4.2.2 非限定名 4.3 ...

  9. 0x00000000指令引用的内存不能为written_「深入Java虚拟机」Java内存区域与内存溢出...

    内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈 ...

最新文章

  1. 计算机c语言试题文档,c语言计算机考试试题
  2. 运动学与雅可比矩阵举例
  3. 苹果错误分析报告preferreuserinterface_数据分析的六个步骤,你做到了吗?
  4. unicode_literals导致的UnicodeEncodeError
  5. 51nod1355 斐波那契的最小公倍数
  6. 浅谈双线程dp (nyoj61 nyoj712)经典【传字条】和【探 寻 宝 藏】
  7. c语言课程总结与反思
  8. 华为ac配置radius认证服务器_华为AAA结合Radius服务器认证学习
  9. 2016年计算机考研大纲,2016考研计算机大纲解析
  10. linux网盘客户端,Linux下的百度网盘客户端BaiduPCS-Go
  11. PHPStudy安全配置
  12. 此windows副本不是正版_阳光单职业传奇正版-阳光单职业传奇正版官网版v2.0
  13. 【verbs】ibv_query_port()
  14. Jcrop+ajaxFileUpload 图片裁切上传 oss(java web)
  15. java商城管理系统_带数据库_带界面化可用来毕业设计
  16. 笨鸟的平凡之路-KETTLE的安装
  17. cglib之Enhancer
  18. 大学计算机算法程序框图,2019高考真题:算法与程序框图,专题解析
  19. curl采集 根据关键词 获取雅虎竞价排名
  20. C# delegate 用法

热门文章

  1. 如何使用vue开发公众号网页
  2. ue4 获取屏幕中心点坐标
  3. 阿里云ECS部署L2TP/IPSEC,访问服务器内网
  4. c51单片机万年历模拟,12864LCD屏显示实时温度与时间
  5. 微信小程序开发之——map组件
  6. 说一说关于破解支付宝AR红包的事
  7. android快速仿花椒,映客直播上下滑动切换直播间
  8. 苹果手机永久删除的照片怎么恢复?
  9. iOS-监听UITextView、UITextField键盘删除键
  10. 电商后台设计:权限设计