使用jvm工具排查系統問題

2023-12-20 06:00:14

java-jvm-tool

Jstatd 遠端連線(推薦)

不用重啟專案

遠端機設定

[demo@localhost jvmtest]$ vi jstatd.all.policy

# 內容
grant codebase "file:/home/demo/jdk1.8.0_171/lib/tools.jar" {
permission java.security.AllPermission;
};

#IP為遠端機外網IP(必須設定ip地址)
[demo@localhost jvmtest]$ nohup jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=172.16.29.61 -p 1099 -J-Djava.rmi.server.logCalls=true &
[1] 203089
[demo@localhost jvmtest]$ nohup: 忽略輸入並把輸出追加到"nohup.out"

[demo@localhost jvmtest]$
[demo@localhost jvmtest]$ tail -f nohup.out
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
        at java.security.AccessController.checkPermission(AccessController.java:884)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.System.setProperty(System.java:792)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
十二月 19, 2023 2:28:49 下午 sun.rmi.server.UnicastServerRef logCall
較詳細: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
十二月 19, 2023 2:28:50 下午 sun.rmi.server.UnicastServerRef logCall
較詳細: RMI TCP Connection(2)-172.16.29.61: [172.16.29.61: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]

# 記得防火牆開埠或者直接關閉防火牆
[root@localhost ~]# firewall-cmd --zone=public --add-port=1099/tcp --permanent
[root@localhost ~]# firewall-cmd --reload

使用者端連線

在設定好環境變數的前提下,直接在cmd下執行 jvisualvm命令。

客戶端運行jvisualvm使用者端執行jvisualvm visualvm中新增遠端機visualvm中新增遠端機

選中新增的遠端機,右擊,點選【新增 jstatd 連線】,可以設定埠以及重新整理時間。

jstatd埠配置jstatd埠設定 配置詳情設定詳情 最終結果最終結果

JMX 連線

伺服器端啟動設定

-Dcom.sun.management.jmxremote.port=8999  \
-Dcom.sun.management.jmxremote.rmi.port=8999 \
-Dcom.sun.management.jmxremote.ssl=false  \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=172.16.29.61 \

使用者端連線

jvisualvm

首先,右擊【遠端】,點選【新增遠端主機】

然後,右擊新增的主機,點選【新增 JMX 連線】,輸入對應埠號。

新增JMX連線新增JMX連線

jconsole

在設定好環境變數的前提下,直接在cmd下執行 jconsole命令。

新建連線新建連線 可檢測死鎖可檢測死鎖

補充

linux shell 引數換行(標準說法:續行)

\Enter,反斜槓後面緊跟回車,表示下一行是當前行的續行。(For Windows, use the carat (^) instead of the backslash (\) to break up a long command into multiple lines)

nohup java -jar -XX:MetaspaceSize=1024m \
-XX:MaxMetaspaceSize=2048m  \
-Dcom.sun.management.jmxremote.port=8999  \
-Dcom.sun.management.jmxremote.rmi.port=8999 \
-Dcom.sun.management.jmxremote.ssl=false  \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=172.16.29.61 \
 -Dlog4j2.formatMsgNoLookups=true \
 ${APP_NAME} --server.port=8082 >> logs/8082.log 2>&1 &

問題

java.security.AccessControlException: access denied

可將檔案 jstatd.all.policy 檔案中的${JAVA_HOME}寫成絕對路徑即可。

參考

Monitoring and Management Using JMX Technology - Java SE Monitoring and Management Guide (oracle.com)

JDK Tools and Utilities

Monitoring and Management Using JMX Technology

Monitoring and Management Guide

Enabling remote JMX with password authentication only (apache.org)

JMX 入門(三)認證加密_jmx 加密-CSDN 部落格

為 JMX JConsole 設定使用者名稱密碼登入_jconsole 連線本機預設使用者名稱密碼-CSDN 部落格

選項 2:在不使用 SSL 的情況下設定 JMX 以進行客戶機認證 - IBM 檔案