实验JDK版本:jdk1.8.0_73
JMC:5.5(最新已经6.0了支持jdk9)html
JMC:Java Mission Control
伴随着5月份oracle的一份开源声明—-JMC Open Sourced JMC又一次备受关注。java
JMC是源自JRockit JVM的一套监控和管理工具,Oracle在发布JAVA 7u4(Java 7 Update 40)时将其包含在JDK中,用户再也不须要单独下载。web
使用 JMC能够监视和管理 Java 应用程序,不会致使相关工具类的大幅度性能开销,它使用为 Java 虚拟机 (JVM) 的普通自适应动态优化收集的数据。设计模式
主要部分api
Java Mission Control 插件使用 Java Management Extensions (JMX) 代理链接到 JVM浏览器
-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.255.255.150
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
配置分两部分:jmx配置和启用JFR。若是使用 JDK 8u40 或更高版本能够在运行时从 JMC 自己启用 JFR。详细参见 Standard Edition Java Flight Recorder Command Referencer缓存
-startup ../lib/missioncontrol/plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
--launcher.library ../lib/missioncontrol/plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20141007-2033
--launcher.appendVmargs -vm ../jre/bin/
-vmargs -XX:+UseG1GC -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true -Djava.net.preferIPv4Stack=true
方式二:
不修改 jmc.ini 文件,则能够在命令行上将 JVM 选项指定为 jmc 命令的 -vmargs 选项的参数。安全
jmc -vmarg 参数
如:设置日志输出目录ruby
jmc -vmargs -Djava.util.logging.config.file=d:/log.log
如下内容有些流水帐,请根据须要选择性阅读服务器
使用 JMX 控制台能够监视和控制正在运行的 Java 虚拟机 (JVM) 实例以及其上运行的应用程序。它提供有关 Java 应用程序特征 (如内存使用量和 CPU 占用率) 和 JVM 活动 (如垃圾收集和方法优化) 的实时信息。
建立完成后双击MBean或者右键–>打开JMX控制台,均能打开控制台
默认布局提供 CPU 和内存使用状况的概览。
概览:能够添加自定义图表,经过概览的加号”添加图表”实现;能够重置,经过”重置为默认控件”实现。
添加图表后,能够经过图表的加号添加相应的子项,并能够在图表上右键详细设置(以下图中的Test)
在相应的图表上右键,能够获取丰富的详细选项
JMC使用托管Bean (MBean) 为监视和管理 Java 应用程序性能提供统一且一致的界面。MBean 是采用符合 JMX 规范的设计模式的托管对象。MBean 能够表示一个设备、一个应用程序或须要托管的任何资源。MBean 的管理界面由一组属性、操做和通知组成。
MBean 浏览器提供对全部已注册 MBean 的访问。MBean 在管理服务器中注册,后者能够经过与 Java Management Extensions (JMX) 兼容的客户机访问
要建立和注册新 MBean,请单击 MBean 面板加号图标。执行此操做会启动动态建立和注册新的 MBean 向导,提示为新 MBean 输入对象名和类名。若要继续,对象名必须有效,而且类名必须是有效的 Java 类名。请注意,该向导不会验证类是否对 MBean 服务器可用;将只进行语法检查。要注销特定 MBean,右键单击并从上下文菜单中选择注销。
MBean功能
使用触发器选项卡能够管理知足特定条件时触发事件的规则。这是一种无需持续地监视应用程序便可跟踪运行时问题的有用方法。以灰色显示的规则在监视的 JVM 中不可用。默认状况下,停用全部规则。要激活某个规则,请选中该规则旁边的复选框
规则详细信息
建立触发器
设置触发规则的条件:
其中持续时间和限定时间的单位以下图
在规则触发时发生的操做
系统选项卡提供了运行 JVM 的系统的信息、JVM 的性能属性以及系统属性列表。
服务器信息
在系统选项卡顶部的服务器信息面板中,包含运行 JVM 的服务器的类别和值列表。这些信息对调试应用程序开发问题和运行时问题以及提出支持请求很是有用。这是通常系统信息,不能更改。
JVM 统计信息
JVM 统计信息面板包含 JVM 主要性能属性的当前值。默认状况下,表中显示如下属性:
要向表中添加属性,请单击 JVM 统计信息面板右上角的添加属性按钮。要删除属性,请在表中右键单击该属性,而后选择删除。右键单击属性后,能够更改其更新间隔、单位,而对于一些属性,还能够设置值。
使用内存选项卡能够监视应用程序使用内存资源的效率。此选项卡主要提供如下方面的信息:堆使用量、垃圾收集和活动内存池。此选项卡上提供的信息可帮助肯定是否已将 JVM 配置为提供最佳应用程序性能。
在内存选项卡中,可使用该选项卡右上角的运行彻底垃圾收集按钮手动启动彻底垃圾收集。
GC 表
GC 表面板包含可用垃圾收集器的主要性能属性的当前值。该面板分为标有活动垃圾收集器名称的多个选项卡
右键单击属性后,能够更改其更新间隔、单位,而对于一些属性,还能够设置值。
活动内存池
活动内存池面板包含一个表,其中列出可供 JVM 使用的内存池的信息。默认状况下,该表包含如下列:
使用线程选项卡能够监视线程活动。此选项卡包含一个绘制应用程序随时间推移的活动线程使用状况的图形、一个由该应用程序使用的全部活动线程的表以及选定线程的堆栈跟踪
活动线程图
活动线程图显示 Java 应用程序随时间推移启动的线程数。默认状况下,图形中显示如下属性:
活动线程
活动线程面板包含一个表,其中列出 Java 应用程序所启动活动线程的信息。默认状况下,该表包含如下列:
实时监视最后三个值会消耗大量系统资源。这就是默认状况下禁用它们的缘由。使用表上方相应的复选框,对这些值启用监视。
可使用 Ctrl 键在活动线程表中选择多个线程来显示多个堆栈跟踪。
使用诊断命令可监视 Java 应用程序的效率和性能。JMC 使用大量不一样的诊断工具,包括一组可使用诊断命令选项卡针对应用程序运行的命令。
运行 JMX 控制台监视 JVM 的额外成本很小,几乎能够忽略不计。它提供低成本的应用程序监视和概要分析 JMX标准参考
JFR 是 JMC 中一个很是关键的功能。是一个用于收集有关正在运行的 Java 应用程序的诊断数据和概要分析数据的工具。它记录了 JVM 全部事件的历史数据,经过这些数据,程序性能分析人员能够结合以往的历史数据对 JVM 性能瓶颈进行分析诊断。它集成到 Java 虚拟机 (JVM) 中,几乎不会带来性能开销,所以甚至能够在高负载生产环境中使用。使用默认设置时,内部测试和客户反馈代表性能影响低于 1%。对于一些应用程序,这一数字会大幅下降。可是,对于短期运行的应用程序 (不是在生产环境中运行的应用程序类型),相对的启动和预热时间可能会较长,这对性能的影响可能会超过 1%。JFR 收集有关 JVM 及其上运行的 Java 应用程序的数据。
JFR 的基本操做是开启一系列的事件。当某个事件发生时,这个事件的全部数据将会被保存至内存或者一个文件当中。数据流被保留在一个环形缓存中,因此只有最近发生的事件的数据才是可用的。JMC 能够从 JVM 或者文件中读取并展现这些事件数据,经过这些数据,能够进行性能分析。
默认状况下,在 JVM 中禁用了 JFR。要启用 JFR,必须使用 -XX:+FlightRecorder 选项启动 Java 应用程序。因为 JFR 是一种商业功能,仅在基于 Java 平台标准版 (Oracle Java SE Advanced 和 Oracle Java SE Suite) 的商业包中提供,所以还须要使用 -XX:+UnlockCommercialFeatures 选项来启用商业功能。(能够参阅在准备阶段配置中的配置)
使用命令行选项能够
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ……
请注意,在 JVM 上运行依赖于 lambda 表单的其余语言时 (如 JavaScript 实施 Nashorn),堆栈跟踪的深度会很是深。要确保对大堆栈的堆栈跟踪正确采样,可能须要增长飞行记录器的堆栈深度。一般将此值设置为 1024 便已足够:
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=stackdepth=1024 ……
飞行记录器插件在一系列选项卡和子选项卡中显示记录文件的信息,并带有包含表和图形的面板。选项卡排列在选项卡组中,这些选项卡组可合并有关 JVM 和 Java 应用程序运行时的特定方面的数据。
通常信息选项卡组显示有关 JVM、系统和记录的通常信息。
列出用于启动 JVM 的系统属性
记录选项卡提供有关记录、可在记录中使用的事件类型及其设置的信息
内存选项卡组显示有关内存管理和垃圾收集的信息
有关线程本地分配缓冲区 (TLAB) 内外的已分配对象的数据
TLAB中的内存分配和TLAB外的内存分配事件。新TLAB分配提供了三种以上专供于分析新TLAB分配事件的虚拟化类型:类级、线程级和分析级的分配。分析级分配是对这三种类型的一个简单的栈追踪集合。TLAB外分配的内存标签页和新TLAB标签页的工做原理相同,仅仅在这个时间点是一致的
限制:由于新TLAB的内存分配事件仅仅只是总的线程本地内存分配的样本,仅仅只有一个事件是很难说明实际状况的。更多的事件才会有更精确的图片。此外,若是分配事件的行为在记录期间变化很是大,那么这样也很难创建一个十分有说服力本地内存分配视图
对象统计信息”选项卡提供有关占用 Java 堆超过 0.5% 的对象的信息
代码分析是Java性能分析重点,经过代码分析,能够清楚的知道系统运行时,哪些类及方法被高频率的调用
代码选项卡组包含有关方法、异常错误、编译和类加载的信息。该选项卡组用于分析与代码执行相关的 Java 应用程序的各个方面。若是 JVM 未生成任何 CPU 负载,线程一般处于等待状态,所以将不会在此选项卡组中获取大量有意义的统计信息
提供有关 Java 应用程序中最经常使用的方法的信息
查看热点方法调用栈,能够了解到系统的主要计算资源消耗状况
显示全部采样的堆栈跟踪 (从 main() 和 run() 开始)。
以模块化的方式直观的看到系统运行状态,显示最经常使用的堆栈跟踪,这对于查找 Java 应用程序中的瓶颈很是有帮助;
显示有关由 Java 应用程序引起的错误和异常错误的信息
线程选项卡组包含有关 Java 应用程序中的线程和锁的信息。能够得知CPU占用率的分布(系统占用率、应用程序+JVM占用率)和活动线程数,判断CPU占用率分布是否合理。
I/O 选项卡组包含有关文件以及套接字读取和写入的信息。此选项卡组可用于分析 Java 应用程序处理的数据量。
提供文件以及套接字读取和写入的高级视图
有关在记录期间进行的文件读取操做的信息
有关记录期间进行的文件写入操做的信息
系统选项卡组包含配置,列出正在运行的进程和正在运行 JVM 和 Java 应用程序的系统上的环境变量。
有关正在运行 Java 应用程序的硬件和软件的信息
含一个表,其中列出记录期间正在系统中运行的全部进程
含一个表,其中列出启动 JVM 时操做系统中设置的环境变量的键值对
事件选项卡组包含有关记录期间收集的事件的信息。JFR 记录每一个事件及其发生时间和与该事件关联的数据。JMC5.5共支持80多种事件。默认状况下,并无开启全部事件类型的记录,将对性能影响较大的 6 种类型事件关闭,以此达到将 JFR 对应用程的影响降到 1%之内,对性能影响的大小由开启记录的事件的类型和数量有关。
收集的事件的日志
事件标签组中的Log标签是查看每一个单独事件的绝佳地址
显示各线程中的事件的时间表图形
经常使用事件类型
事件类型 | JFR或其余工具获取 | 只能JFR获取 |
---|---|---|
Classloading | 被加载的类的数量和未被加载的类的数量 | 加载类的类加载器(classloader),加载一个类须要的时间 |
Thread statistics | 建立线程的数量、销毁线程的数量、线程快照(dump) | 阻塞指定线程的锁以及被指定锁阻塞的线程 |
Throwables | 应用程序实用的异常类 | 应用程序抛出的异常和错误的数量以及建立异常和错误的栈记录 |
TLAB allocation | 内存堆中已分配的数量、TLAB(Thread-Local Allocation Buffers)的大小 | 在内存对中指定对象的内存分配以及为这些对象分配内存的栈记录 |
File and socket I/O | 进行 I/O 消耗的时间 | 每一次读写调用的时间消耗,读写操做消耗时间过长的文件或套接字 |
Monitor blocked | 等待监控器的线程 | 阻塞某个线程的监控器、线程被阻塞的时间 |
Code cache | 代码缓存的大小以及内容 | 从代码缓存中移除的方法、代码缓存的配置 |
Code compilation | 哪些方法被编译,OSR 编译,编译耗时 | JFR 中没有额外的信息,但 JFR 总结了多个源文件的信息 |
Garbage collection | GC 的次数,包括每个阶段的次数、每一个代的大小 | JFR 中没有额外的信息,但 JFR 总结了来自多个工具的信息 |
Profiling | 检测分析和采样分析 | JFR 并不能得到分析器得到的丰富信息,但 JFR 提供了更高层次的概述 |
针对JMX的配置能够扩展了解一下,没兴趣能够略过
HotSpot JVM 使用基于远程方法调用 (RMI) 链接器的Java Management Extensions (JMX)技术启用监视和管理功能。这也称为基于RMI的JMX或简称 JMXRMI。要配置链接,启动 JVM 时必须设置如下系统属性:
-Dcom.sun.management.jmxremote
此选项用于切换 JMXRMI 的使用。默认状况下启用该选项,所以无需设置该选项就可使用 JVM 的监视功能。要为 JVM 禁用 JMXRMI,请指定 -Dcom.sun.management.jmxremote=false。
-Dcom.sun.management.jmxremote.authenticate
该选项用于切换对 JMXRMI 链接使用口令验证。默认状况下此选项是启用的。要为 JVM 禁用口令验证,请指定 -Dcom.sun.management.jmxremote.authenticate=false。
注意:禁用验证是不安全的。任何知道 (或猜中) JMX 端口号和主机名的远程用户都可以监视和控制 Java 应用程序和 VM。虽然开发时这是可接受的,但对于生产系统不建议这样设置。
-Dcom.sun.management.jmxremote.port
此选项用于设置 JMXRMI 链接的端口号。必须设置未使用的端口号才能启用 JVM 的监视和管理功能。
-Dcom.sun.management.jmxremote.ssl
此选项用于切换安全套接字层 Sockets Layer (SSL) 验证的使用。默认状况下启用该选项。要为 JVM 禁用 SSL 验证,请指定 -Dcom.sun.management.jmxremote.ssl=false。
更多配置信息 请移步