JConsole图形用户界面是符合Java管理扩展(JMX)规范的监视工具,可以监测有关在Java平台上运行的应用程序的性能和资源消耗的信息。

启动JConsole

jconsole [ options ] [ connection ... ]

connection = pid | host:port | jmxURL

-interval=n:设置更新间隔(默认4秒)
-notile :不平铺 (for two or more connections).

-pluginpath plugins:指定目录,及jar路径。

jar中必须包含 META-INF/services/com.sun.tools.jconsole.JConsolePlugin

关于jmxURL,可以参考javax.management.remote.JMXServiceURL说明。

2.本地监控

% jconsole
#进程
% jconsole processID
 

技术图片

3.远程监控

%jconsole hostName:portNum
 

技术图片

3.1远程监控配置

设置此属性注册了Java VM平台的MBean并通过专用接口发布了远程方法调用(RMI)连接器,以允许JMX客户端应用程序监视本地Java平台,即与JMX客户机在同一台机器上运行的Java VM 。

3.1开启JMX端口

com.sun.management.jmxremote
#JDK6以前版本,需要为Java SE示例应用程序记事本启用JMX代理
%cd JDK_HOME /demo/jfc/ Notepad
%java -Dcom.sun.management.jmxremote -jar Notepad.jar
#JDK以后版本可以启用开箱即用的管理代理监视和管理
%java -jar Notepad.jar
#portNum是要启用JMX RMI连接的端口号
#设置此属性将使用众所周知的名称“jmxrmi”在指定端口的私有只读注册表中发布一个附加的RMI连接
com.sun.management.jmxremote.port = portNum
 

对于生产系统,使用SSL客户端证书来验证用户管理的客户端主机和密码认证。

有关详细信息,请参阅使用SSL和 使用LDAP身份验证的主题。

3.2使用密码认证

#开启或禁用
com.sun.management.jmxremote.authenticate=false
 

3.2.1 LDAP(不熟悉,不讨论)

com.sun.management.jmxremote.login.config
 

3.2.2 密码认证

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 
\-Dcom.sun.management.jmxremote.ssl=false 
\-Dcom.sun.management.jmxremote.authenticate=true 
\-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password 
\-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access
 

其中com.sun.management.jmxremote.password.file可以从 JRE_HOME/lib/jmxremote.password.template模板获得;

com.sun.management.jmxremote.access.file可以同JRE_HOME/lib/jmxremote.access模板获得

4.功能

4.1选项卡

技术图片

概述(Overview):显示有关Java VM和监视值的概述信息。
内存(Memory):显示有关内存使用的信息。
线程(Threads):显示有关线程使用的信息。
类(Classes):显示有关加载类的信息。
VM(VM Summary):显示有关Java VM的信息。

MBeans(MBeans):显示有关MBean的信息。

4.1.1概述信息

“概述”选项卡显示有关CPU使用情况,内存使用情况,线程计数以及Java VM中加载的类的图形监视信息,均在单个屏幕中。
技术图片

JConsole允许您将图表中显示的数据保存在逗号分隔值(CSV)文件中。要从图表保存数据,只需右键单击任何图表,

4.1.2 内存选项卡

“内存”选项卡提供有关内存消耗和内存池的信息。

技术图片

  • Eden Space (heap): 最初为大多数对象分配内存的池

  • Survivor Space (heap): 包含在Eden空间的垃圾回收中幸存下来的对象的池

  • Tenured Generation (heap):包含在幸存者空间中存在一段时间的对象的池

  • Permanent Generation (non-heap):包含虚拟机本身的所有反射数据的池,如类和方法对象。对于使用类数据共享的Java VM,这一代分为只读和读写区

  • Code Cache (non-heap): HotSpot Java VM还包括代码缓存,其中包含用于编译和存储本机代码的内存。

“ 详细信息”区域显示几个当前内存指标:
已使用(Used):当前使用的内存量,包括所有对象占用的内存,可访问和不可访问。

承诺(Committed):保证可供Java VM使用的内存量。承诺的内存量可能会随时间而变化。Java虚拟机可能会将内存释放到系统,并且已提交内存的数量可能小于启动时初始分配的内存量。提交的内存量将始终大于或等于已使用的内存量。

最大值(Max):可用于内存管理的最大内存量。其价值可能会改变或未定义。即使所使用的数量小于或等于最大值(例如,当虚拟内存系统较低时),如果Java VM尝试增加使用的内存大于已提交的内存,则内存分配可能会失败。

GC时间:在垃圾收集上花费的累积时间和总调用次数。它可能有多行,每行都表示Java VM中使用的一个垃圾收集器算法。

右下方的条形图显示堆和非堆内存中的内存池所消耗的内存。当使用的内存超过内存使用阈值时,该条将变为红色。您可以通过MemoryMXBean的属性设置内存使用阈值。

    Heap and Non-Heap

非堆内存包括所有线程之间共享的方法区域和Java VM的内部处理或优化所需的内存。它存储每个类的结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码.

堆内存是运行时数据区域,Java VM为此分配所有类实例和数组的内存.

内存池和内存管理器
内存池和内存管理器是Java VM内存系统的关键方面。
1.一个内存池表示Java虚拟机管理的存储区。Java VM具有至少一个内存池,并且可能在执行期间创建或删除内存池。内存池可以属于堆或非堆内存。
2.一个内存管理器管理一个或多个存储池。垃圾回收器是一种负责回收由不可达对象使用的内存的内存管理器。Java VM可能有一个或多个内存管理器。它可能会在执行期间添加或删除内存管理器。内存池可以由多个内存管理器管理。

垃圾收集

有关更多信息,请参阅使用5.0 HotSpot VM调整垃圾收集

技术图片

4.1.3监控线程使用
“线程”选项卡提供有关线程使用的信息。

技术图片

左下角的线程列表列出了所有活动线程。如果在“过滤器”字段中输入字符串,“线程”列表将只显示名称包含您输入的字符串的线程。单击“线程”列表中的线程名称,以显示有关该线程的信息,包括线程名称,状态和堆栈跟踪。
图表显示随着时间的推移活动线程数。显示两行。
红色:峰值线程数
蓝色:活动线程数。

线程MXBean提供了几个其他有用的操作,这些操作未被“线程”选项卡覆盖。
findMonitorDeadlockedThreads:检测对象监视器锁上是否有任何线程死锁。此操作返回一系列死锁的线程ID。
getThreadInfo:返回线程信息。这包括名称,堆栈跟踪和线程当前被阻止的监视器锁(如果有)以及哪个线程持有该锁以及线程争用统计信息。
getThreadCpuTime:返回给定线程消耗的CPU时间。

2.检测死锁线程
技术图片

检测死锁按钮将检测涉及对象监视器和java.util.concurrent可自动同步器的死锁周期(请参阅java.lang.management.LockInfo的API规范 文档)。在Java SE 6中添加了对java.util.concurrent锁的监视支持 。如果JConsole连接到Java SE 5.0 VM,则检测死锁机制将只会发现与对象监视器相关的死锁。JConsole不会显示与所有同步器相关的任何死锁。

4.1.4 监控类加载

“类”选项卡显示有关类加载的信息。
技术图片
红线是加载的类的总数(包括随后卸载的类)。
蓝线是当前加载的类的数量。

选项卡底部的“详细信息”部分显示自Java VM启动以来加载的类的总数,当前加载的数量和卸载的数量。您可以通过选中右上角的复选框将类加载跟踪设置为详细输出。
4.1.5 查看VM信息
“VM摘要”选项卡提供有关Java VM的信息。

技术图片

  • Summary

    • Uptime: Java VM启动以来的总时间

    • Process CPU Time: Java VM自启动以来消耗的CPU总时间。

    • Total Compile Time:在JIT 编译中花费的总累计时间

  • Threads

    • Live threads: 当前的守护进程线程数和非守护进程线程数。

    • Peak: 自Java VM启动以来最多的实时线程数。

    • Daemon threads: 当前的守护进程线程数。

    • Total threads started: Java VM启动后启动的线程总数,包括守护程序,非守护程序和已终止的线程。

  • Classes

    • Current classes loaded当前加载到内存中的类数。

    • Total classes loaded:自Java VM启动以来加载到内存中的总数,包括随后卸载的类的总数。

    • Total classes unloaded:从Java VM启动以来从内存中卸载的类数。

  • Memory

    • Current heap size堆当前占用的千字节数。

    • Committed memory: 分配给堆使用的内存总量。

    • Maximum heap size:占用的最大千字节数。

    • Objects pending for finalization:等待完成的对象数量。

    • Garbage collector: 有关垃圾收集的信息,包括垃圾回收器名称,执行的集合数以及执行GC的总时间。

  • Operating System

    • Total physical memory:操作系统具有的随机存取存储器(RAM)的数量。

    • Free physical memory: 操作系统可用的可用内存量。

    • Committed virtual memory: 保证运行进程可用的虚拟内存量。

  • Other Information

    • VM arguments: 应用程序传递给Java VM的输入参数,不包括main方法的参数。

    • Class path: 系统类加载器用于搜索类文件的类路径。

    • Library path: 加载库时要搜索的路径列表。

    • Boot class path:引导类路径由引导类加载器用于搜索类文件。

 

 

参考资料

1、http://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html

2、http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jconsole.html

3、http://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html