摘要

jconsole 是JDK自带的一款图形化监测工具
他可以监测本地程序,也可以检测远程的机器
在没有其他监控手段可以使用的情况下可以快速进行必要的监测
使用方法也比较简单.

本地监控

jconsole 存在于jdk的bin 目录下
所以不管是windows还是linux
只要PATH下面有jdk相关的 bin 目录就可以通过命令行
jconsole的方式打开进程

可以选择是否本地监控,就可以附加到本地的jvm进程上面.
可以选择使用不安全的连接就可以了

jconsole的简单介绍

1. 概览
可以查看JVM的大体信息,比如JVM的内存, 线程等情况
也能看到CPU占用率,以及class的总数
可以选择时间周期进行查看.
2. 内存
可以分不同类型查看内存的使用情况.
如果有OOM的情况在宕机之前还是能看到很多内容的.
3. 线程
可以展示线程的详细信息.
点击左下角能够看到线程的堆栈信息.可以进行简单问题定位.
4. 类
查看类的加载卸载情况.
5. VM概要
类似于 jinfo $pid的效果,比较直观和全面.
6. Mbean
查看加载的bean等情况, 这一块我不太清楚具体用途.

远程监控

可以在远程服务器的JVM的启动脚本上面增加如下参数
在启动服务后就可以输入远程ip加 61127 的端口就可以远程挂载了.
这种方式比较危险, 没有安全校验.
-Dcom.sun.management.jmxremote.port=61127
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

增加认证的远程

可以增加用户密码等信息. 
需要注意着原始文件的默认路径为:
/jre/lib/security/
可以复制一个文件 增加上一行 比如:
zhaobsh Testxxxx 就可以在远程时输入密码就可以了.

-Dcom.sun.management.jmxremote.port=61127
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password

增加ssl认证的远程

  • 过程比较复杂, 其实可以放到默认的jdk的ca仓库中.
  • JDK的默认ca的truststore的密码是 changeit
  • 这一块我还没有仔细做实验. 改天可以尝试.
# 可以使用jdk自带的keytool命令创建证书
keytool -genkeypair -alias jconsole -keyalg RSA -validity 36500
-storetype pkcs12 -keystore jconsole.keystore
-storepass Testxxxx -keypass Testxxxx
-dname "CN=inspur,OU=org,O=gs,L=jinan,S=shandong,C=CN"

命令解释:
-alias jconsole 密钥对别名为jconsole
-keystore jconsole.keystore 密钥库名称为jconsole.keystore
-storepass Testxxxx 存储密码为 Testxxxx
-keypass Testxxxx 密钥密码为 Testxxxx
-dname 证书申请实体信息

导出证书以及添加到授信CA

keytool -exportcert -alias jconsole 
-storetype pkcs12 -keystore jconsole.keystore
-file jconsole.cer -storepass Testxxxx

keytool -importcert -alias jconsole
-file jconsole.cer -keystore jconsole-ssl.truststore
-storepass Testxxxx -noprompt

创建应用的证书

# 创建
keytool -genkeypair -alias app -keyalg RSA
-validity 36500 -storetype pkcs12 -keystore app.keystore
-storepass Testxxxx -keypass Testxxxx
-dname "CN=inspurAPP,OU=org,O=gs,L=jinan,S=shandong,C=CN"
# 导出
keytool -exportcert -alias app
-storetype pkcs12 -keystore app.keystore
-file app.cer -storepass Testxxxx
# 导入到授信ca
keytool -importcert -alias app -file app.cer
-keystore app-ssl.truststore -storepass Testxxxx -noprompt

服务端JDK8的自动启动

-Dcom.sun.management.jmxremote.port=61127  
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.registry.ssl=true
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true
-Djavax.net.ssl.trustStore=/patch/to/jconsole-ssl.truststore
-Djavax.net.ssl.trustStorePassword=Testxxxx
-Djavax.net.ssl.keyStore=${path}
-Djavax.net.ssl.keyStorePassword=Testxxxx

客户端Jconsole的启动

jconsole 
-J-Djavax.net.ssl.trustStore=F:\professional\java-cert\app-ssl.truststore
-J-Djavax.net.ssl.trustStorePassword=Testxxxx
-J-Djavax.net.ssl.keyStore=F:\professional\java-cert\jconsole.keystore
-J-Djavax.net.ssl.keyStorePassword=Testxxxx


感觉ssl还是比较复杂的, 建议用密码就可以了..