jconsole
简介
jconsole
是Java平台自带的一款图形化监控工具,位于JDK/bin目录下,它提供了一个直观的用户界面,使开发者能够轻松地连接到运行在本地或远程的JVM,并查看关于JVM的各种运行时信息。这些信息包括内存使用情况、线程活动、类加载情况、垃圾收集统计等。除了监控功能外,JConsole还可以执行一些管理操作,例如执行垃圾回收、线程Dump、线程死锁检测等操作。
实验环境介绍
本地机win10安装JDK17。
虚拟机centos7安装JDK17,存在一个java程序,待启动。
JMX
相关的三个文件
在linux的jdk目录下,jdk-17/conf/management
目录包含了与 JMX(Java Management Extensions)远程监控相关的三个文件:
jmxremote.access
:这是一个访问控制文件,它定义了不同角色的访问权限。这个文件非常重要,因为它控制了哪些用户可以远程连接到 JMX 代理,以及他们可以执行哪些操作。jmxremote.password.template
:这是一个密码文件的模板。在默认情况下,JMX 代理使用jmxremote.password
文件来存储认证用户和密码。这个模板文件用于生成实际的密码文件,其中包含了一些默认的条目和格式。management.properties
:这是一个管理配置文件,它可能包含了关于 JMX 代理配置的信息,如密码文件和访问控制文件的路径、代理的端口号、是否启用 SSL 等。
为了使 JMX 远程监控工作,我们需要配置这些文件,并为不同的角色设置密码和访问权限。
这涉及到编辑 jmxremote.password
文件以添加用户和密码,以及编辑 jmxremote.access
文件以定义这些用户的访问权限。
添加用户和密码
生成密码文件
创建一个密码文件(jmxremote.password
),用于存储认证用户和密码。这个文件应该放在某个目录下,这里选择放在当前目录下/usr/local/jdk-17/conf/management
。
echo "cengxuyuan jmxroot" > jmxremote.password
其中 cengxuyuan
和 jmxroot
为用户名和密码。
设置密码文件权限
根据jmxremote.password.template
文件的要求,为了安全起见,我们限制密码文件的访问权限,以确保只有所有者可以读取它。否则会提示错误
错误: 必须限制口令文件读取访问权限: /usr/local/jdk-17/conf/management/jmxremote.password
chmod 600 jmxremote.password
600
:表示权限的八进制数。在 Unix 系统中,权限可以分为三组,每组三位:
- 第一位:文件属主(owner)的权限。
- 第二位:与文件属主同组的用户的权限。
- 第三位:其他用户的权限。
每个位置可以设置为以下三种权限之一:
r
(读取):4 权限位。w
(写入):2 权限位。x
(执行):1 权限位。
因此,600
表示:
- 文件属主有读写权限(4+2=6)。
- 与文件属主同组的用户和其他用户没有读写权限(0)(0)。
定义访问权限
创建(修改)访问控制文件(jmxremote.access
),用于定义不同用户的访问权限。这个文件也放在当前目录下/usr/local/jdk-17/conf/management
。
echo "cengxuyuan readwrite" > jmxremote.access
cengxuyuan
为之前的用户名,readwrite
表示用户拥有读写权限。如果需要只读权限,可以将其替换为 readonly
。
Java程序启动
在启动 Java 应用程序时,添加以下 JVM 参数来启用 JMX 并配置认证:
java \
-Djava.rmi.server.hostname=192.168.101.101 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/usr/local/jdk-17/conf/management/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/usr/local/jdk-17/conf/management/jmxremote.access \
-jar jvm-better.jar &
这些参数的含义如下:
-D
选项用于设置 JVM 启动时的系统属性。这些系统属性定义了 JMX 远程监控的配置。-Djava.rmi.server.hostname=192.168.101.101
:这是一个 JVM 启动参数,用于指定(Remote Method Invocation)服务器的主机名。这个主机名用于 RMI 客户端和服务器之间的通信。-Dcom.sun.management.jmxremote=true
:启用 JMX 远程监控。-Dcom.sun.management.jmxremote.port=1099
:指定 JMX 代理监听的端口号,默认是 1099。-Dcom.sun.management.jmxremote.ssl=false
:指定是否使用 SSL 加密连接,默认是 false。-Dcom.sun.management.jmxremote.authenticate
:指定是否需要客户端认证,默认是 false。-jar
选项用于指定要运行的 JAR 文件。&
符号将程序放入后台运行。
本地jconsole
连接
在本地JDK的bin目录下,找到jconsole.exe
,打开。
启动 jconsole
后,会弹出一个界面,显示本地所有正在运行的 Java 进程。
我们输入远程连接地址,格式是 ip:port
(注意 port 是监听端口不是服务端口)和用户名、口令即可连接进入监听界面。
192.168.101.101:1099
cengxuyuan jmxroot
点击 不安全的连接
。
进入到监听界面。
连接到远程 JVM 后,我们可以看到 JVM 的运行状态和性能指标,包括内存使用情况、线程状态、类加载信息等。
手动申请gc。
检测死锁。
附录
jmxremote.password.template
内容如下############################################################## # jmxremote.password 文件的权限 ############################################################## # 这个文件必须只允许所有者访问, # 否则程序将退出并显示错误。 # # 在典型的安装中,这个文件可以被本地机器上的任何人访问, # 甚至可能被其他机器上的人访问。 # 为了安全起见,您应该限制对此文件的访问,只允许所有者访问, # 在生产环境中,建议部署一个只读的哈希密码文件。 # 哈希密码条目可以在运行 JMX 代理之前预先生成。 ############################################################## # jmxremote.password 文件示例 ############################################################## # 下面是两个被注释掉的条目。 "monitorRole" 角色有密码 "QED"。 # "controlRole" 角色有密码 "R&D"。这是在明确中指定密码的示例 # # monitorRole QED # controlRole R&D # # 一旦进行了登录尝试,密码将被哈希,文件将具有以下条目, # 明文密码将被它们各自的 SHA3-512 哈希覆盖 # # monitorRole trilby APzBTt34rV2l+OMbuvbnOQ4si8UZmfRCVbIY1+fAofV5CkQzXS/FDMGteQQk/R3q1wtt104qImzJEA7gCwl6dw== 4EeTdSJ7X6Imu0Mb+dWqIns7a7QPIBoM3NB/XlpMQSPSicE7PnlALVWn2pBY3Q3pGDHyAb32Hd8GUToQbUhAjA== SHA3-512 # controlRole roHEJSbRqSSTII4Z4+NOCV2OJaZVQ/dw153Fy2u4ILDP9XiZ426GwzCzc3RtpoqNMwqYIcfdd74xWXSMrWtGaA== w9qDsekgKn0WOVJycDyU0kLBa081zb
jmxremote.access
内容如下###################################################################### # 远程JMX(TM)监控的默认访问控制文件 ###################################################################### # # 用于远程JMX API监控访问的访问控制文件。 # 此文件定义了不同角色的允许访问权限。密码文件(默认为jmxremote.password)定义了角色及其密码。 # 要使角色生效,它们必须在密码文件和访问控制文件中都有对应的条目。 # # 此文件的默认位置是$JRE/conf/management/jmxremote.access # 您可以通过在管理配置文件$JRE/conf/management/management.properties中指定属性来指定其他位置。 # (有关详细信息,请参见该文件) # # 密码文件和访问控制文件的格式在语法上与Properties文件格式相同。语法在java.util.Properties.load的Javadoc中有所描述。 # 一个典型的访问控制文件有多个行,其中每一行都是空行、注释(如本行)或访问控制条目。 # # 访问控制条目由角色名称和关联的访问级别组成。角色名称是不能包含空格或制表符的任何字符串。 # 它与密码文件(jmxremote.password)中的条目相对应。访问级别可以是以下之一: # "readonly"授予读取MBeans属性的权限。 # 对于监控来说,这意味着远程客户端可以读取度量值,但不能执行任何可能改变运行程序环境的操作。 # "readwrite"授予读取和写入MBeans属性的权限,调用它们的操作,并可以选择创建或删除它们。 # 这种访问级别应该只授予受信任的客户端,因为它们可能会干扰正在运行的程序的平稳操作。 # # "readwrite"访问级别后面可以可选地跟随"create"和/或"unregister"关键字。"unregister"关键字授予取消注册(删除)MBeans的权限。 # "create"关键字授予创建特定类或匹配特定模式的任何类的MBeans的权限。应该只授予创建已知和受信任类的MBeans的权限。 # # 例如,以下条目将授予"controlRole""readwrite"访问权限,以及创建javax.management.monitor.CounterMonitor类的MBeans和取消注册任何MBean的权限: # controlRole readwrite \ # create javax.management.monitor.CounterMonitorMBean \ # unregister # 或者等价地: # controlRole readwrite unregister create javax.management.monitor.CounterMBean # # 以下条目将授予"controlRole""readwrite"访问权限,以及创建javax.management.monitor和javax.management.timer包中任何类的MBeans的权限: # controlRole readwrite \ # create javax.management.monitor.*,javax.management.timer.* \ # unregister # # \字符在属性文件语法中定义为允许行继续的字符。类模式中的*匹配除点(.)之外的任何字符序列,因此javax.management.monitor.*匹配javax.management.monitor.CounterMonitor,但不匹配javax.management.monitor.foo.Bar。 # # 每个角色在文件中最多只能有一个条目。如果一个角色没有条目,它将没有访问权限。如果为同一角色名称找到多个条目,则使用最后一个访问条目。 # # # 默认访问控制条目: # o "monitorRole"角色具有"readonly"访问权限。 # o "controlRole"角色具有"readwrite"访问权限,并且可以创建JMX API定义的标准Timer和Monitor MBeans。