JVM——VisualVM使用說(shuō)明

概述

  • VisualVM 是一款免費(fèi)的\集成了多個(gè) JDK 命令行工具的可視化工具,它能為您提供強(qiáng)大的分析能力,對(duì) Java 應(yīng)用程序做性能分析和調(diào)優(yōu)。

  • VisualVM提供了包括生成和分析海量數(shù)據(jù)、跟蹤內(nèi)存泄漏、監(jiān)控垃圾回收器、執(zhí)行內(nèi)存和 CPU 分析,同時(shí)它還支持在 MBeans 上進(jìn)行瀏覽和操作等功能。

VisualVM 下載地址:http://visualvm.github.io/download.html

  • 相比JConsole,感覺(jué)功能更強(qiáng)大,且可集成各類(lèi)插件,使其更強(qiáng)大。Jconsole算是VisualVM的子集吧。另外VisualVM也有JConsole的插件;
  • 相比Arthas,它最大的特點(diǎn)肯定就是圖形化了。Arthas必須得命令敲著走,且命令眾多,不易上手(還全是英文……),并且它是JDK自帶的。
  • 對(duì)于eclipse和idea(VisualVM Launcher),也有相應(yīng)插件,可在軟件界面快速打開(kāi)visualvm。

對(duì)于性能分析,主要幾個(gè)點(diǎn)即是:

  • 監(jiān)控:實(shí)時(shí)CPU監(jiān)控、內(nèi)存監(jiān)控、線程監(jiān)控、其他監(jiān)控;
  • 轉(zhuǎn)儲(chǔ):從內(nèi)存中獲得當(dāng)前狀態(tài)數(shù)據(jù)并存儲(chǔ)到文件用于后續(xù)分析,一般是線程信息轉(zhuǎn)儲(chǔ)、類(lèi)加載信息轉(zhuǎn)儲(chǔ),以及堆上對(duì)象的轉(zhuǎn)儲(chǔ);
  • 快照:cpu情況快照、內(nèi)存情況快照;
  • 分析:程序中函數(shù)的調(diào)用關(guān)系、運(yùn)行時(shí)間、內(nèi)存分配及使用情況、載入的類(lèi)、存在的對(duì)象信息等。
  • JFR:可以查看JFR文件,即jmc的飛行記錄。

VisualVM遠(yuǎn)程監(jiān)控連接方法

VisualVM會(huì)自動(dòng)檢測(cè)本機(jī)運(yùn)行中的JVM并建立連接,本文主要介紹連接遠(yuǎn)程Linux服務(wù)器的配置方法。

VisualVM連接遠(yuǎn)程服務(wù)器有兩種方式:JMX和jstatd,兩種方式都不能完美支持所有功能,例如JMX不支持VisualGC,jstatd不支持CPU監(jiān)控,實(shí)際使用可同時(shí)配置上并按需選用。

window客戶(hù)端的VisualVM,需要安裝一些插件:


配置Jstatd

配置安全策略

配置java安全訪問(wèn),將如下的代碼存為文件 jstatd.all.policy,放到JAVA_HOME/bin中,其內(nèi)容如下,

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

啟動(dòng)jstatd

cd $JAVA_HOME/bin

執(zhí)行命令:

nohup ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.206.130 &(192.168.206.130  為你服務(wù)器的ip地址,&表示用守護(hù)線程的方式運(yùn)行)

這里需要注意一點(diǎn),后面的 -J-Djava.rmi.server.hostname=192.168.206.130 不指定也是可以的,但是有可能遠(yuǎn)程連接不上,所以本人指定了。

jps命令查看下,是否已正常啟動(dòng)jstatd

設(shè)置防火墻

除了把1099添加到防火墻規(guī)則外,還需要找到另外一個(gè)隨機(jī)端口,也加入到規(guī)則中
執(zhí)行
netstat -anp | grep *jstatd

可以看到除了1099,jstatd還監(jiān)聽(tīng)了53040端口,把這個(gè)也加入到規(guī)則中,添加方法參照2.5
(注意:這個(gè)隨機(jī)端口重啟后會(huì)變化)

如果擔(dān)心配置的可能會(huì)影響遠(yuǎn)程連接,建議先將防火墻關(guān)閉:/etc/init.d/iptables stop

測(cè)試

啟動(dòng)VisualVM,因?yàn)樵谂渲肑MX時(shí)已經(jīng)添加過(guò)服務(wù)器節(jié)點(diǎn),如果配置正確,通常VisualVM會(huì)自動(dòng)檢測(cè)到j(luò)statd連接并添加節(jié)點(diǎn)


配置JMX

遠(yuǎn)程連接啟動(dòng)authenticate、ssl參數(shù)

#指定hostname 一般情況需要重新指定hostname,否則連接不成功
-Djava.rmi.server.hostname=192.168.0.147

#指定hostname 指定端口默認(rèn):1099
-Dcom.sun.management.jmxremote.port=8899

#禁止ssl連接
-Dcom.sun.management.jmxremote.ssl=false

#禁止用戶(hù)認(rèn)證
-Dcom.sun.management.jmxremote.authenticate=false

認(rèn)證配置

#指定hostname 一般情況需要重新指定hostname,否則連接不成功
-Djava.rmi.server.hostname=192.168.0.147

#指定hostname 指定端口默認(rèn):1099
-Dcom.sun.management.jmxremote.port=8899

#禁止ssl連接
com.sun.management.jmxremote.ssl=false

#開(kāi)啟用戶(hù)認(rèn)證
com.sun.management.jmxremote.authenticate=true

#認(rèn)證用戶(hù)名密碼
-Dcom.sun.management.jmxremote.password.file=/opt/home/lichengwu/jvm/management/jmxremote.password
#訪問(wèn)模式
-Dcom.sun.management.jmxremote.access.file=/opt/home/lichengwu/jvm/management/jmxremote.access

 (jmxremote.access和jmxremote.password 在JAVA_HOME\jre\lib\management下有模板)

進(jìn)入tomcat/conf目錄,執(zhí)行

cp $JAVA_HOME/jre/lib/management/jmxremote.password.template jmxremote.password

cp $JAVA_HOME/jre/lib/management/jmxremote.access jmxremote.access
  • jmxremote.access內(nèi)容
admin readwrite
  • jmxremote.password內(nèi)容
admin 123456
  • 兩個(gè)文件授權(quán)(必須按下面方式授權(quán),chmod777都不行)
chmod 600 jmxremote.access
chmod 600 jmxremote.password
chown root:root jmxremote.access
chown root:root jmxremote.password

進(jìn)入tomcat安裝目錄安裝找到catalina.sh文件,在CATALINA_OPTS中的配置變更:

CATALINA_OPTS="-Xms1024m -Xmx6144m -XX:+HeapDumpOnOutOfMemoryError 
-XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-Dspring.profiles.active=production 
-Xloggc:/data/logs/gc-`date +"%Y-%m-%d_%H%M%S"`.log 
-XX:MaxPermSize=1024M 
-Dcom.sun.management.jmxremote=true 
-Djava.rmi.server.hostname=115.29.206.6 
-Dcom.sun.management.jmxremote.port=6666 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.managementote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder"

第三種配置------SSL

參考:https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html#SSL_enabled

  • 1、在服務(wù)器上使用keytool創(chuàng)建密鑰對(duì)
    keytool是java平臺(tái)自帶的一個(gè)密鑰和證書(shū)管理工具,使用keytool創(chuàng)建密鑰對(duì):
keytool -genkey -alias jetty -keystore /opt/home/lichengwu/jvm/ssl/jettyKeyStore

按照提示輸入相關(guān)信息(包括設(shè)定密碼、姓、組織名等),這些信息是可以隨便輸入的,但從產(chǎn)品角度講應(yīng)該統(tǒng)一設(shè)定。輸入的密碼在今后操作中均需要使用。

  • 2、導(dǎo)出公鑰
keytool -export -alias jetty -keystore /opt/home/lichengwu/jvm/ssl/jettyKeyStore -file /opt/home/lichengwu/jvm/ssl/jetty.cert
  • 3、將公鑰導(dǎo)入至需要運(yùn)行VisualVM的機(jī)器。(我的是windows 放在 Z:\jvm\ssl\jetty.cert)
keytool -import
 -alias jetty -keystore Z:\jvm\ssl\jettyKeyStore -file Z:\jvm\ssl\jetty.cert
  • 4、修改jetty的啟動(dòng)腳本
-Dcom.sun.management.jmxremote.ssl="true

并添加:
-Djavax.net.ssl.keyStore=/opt/home/lichengwu/jvm/ssl/jettyKeyStore
-Djavax.net.ssl.keyStorePassword=123456
  • 5、使用如下參數(shù)啟動(dòng)VisualVM:
VisualVM -J-Djavax.net.ssl.trustStore=Z:\jvm\ssl\jettyKeyStore

1、概述

應(yīng)用程序和運(yùn)行時(shí)環(huán)境的基本信息


基本參數(shù)

PID:應(yīng)用程序的進(jìn)程ID
主機(jī):應(yīng)用程序運(yùn)行的系統(tǒng)地址
主類(lèi):運(yùn)行了main方法的類(lèi)
參數(shù):應(yīng)用啟動(dòng)時(shí)所傳遞的參數(shù)信息
JVM:當(dāng)前的JVM信息
Java:當(dāng)前使用的JDK信息
Java Home:JDK的位置
JVM標(biāo)志:?jiǎn)?dòng)JDK時(shí)JVM使用的的標(biāo)志
出現(xiàn)OOME時(shí)生產(chǎn)堆dump:當(dāng)前出現(xiàn)OOME時(shí)生產(chǎn)堆dump功能的開(kāi)啟/禁用狀態(tài)

保存的數(shù)據(jù)

  • 顯示VisualVM存儲(chǔ)的當(dāng)前應(yīng)用程序的信息

詳細(xì)信息

  • JVM參數(shù):配置的JVM啟動(dòng)的參數(shù)信息
  • 系統(tǒng)屬性 :JVM運(yùn)行的系統(tǒng)屬性

2、監(jiān)視

展示監(jiān)聽(tīng)的當(dāng)前應(yīng)用程序的整體情況

  • CPU:CPU的使用百分比

  • 內(nèi)存:內(nèi)存的占用情況,包括內(nèi)存大小、最大值和已經(jīng)使用的大小

    • 堆:堆內(nèi)存的大小和堆內(nèi)存使用情況
    • Metaspace:元空間內(nèi)存的使用情況
  • 類(lèi):顯示了已經(jīng)加載的類(lèi)數(shù)量和共享類(lèi)的數(shù)量

  • 線程:顯示了應(yīng)用程序在JVM中生存和守護(hù)線程的數(shù)量

  • 堆dump:執(zhí)行堆dump,在新的標(biāo)簽頁(yè)打開(kāi),查看dump的詳細(xì)信息

3、線程

  • 展示了應(yīng)用程序的線程數(shù)據(jù),包括所有線程數(shù)、活動(dòng)線程數(shù)、完成線程數(shù)


  • 線程dump:執(zhí)行線程dump,在新標(biāo)簽頁(yè)打開(kāi)結(jié)果


4、抽樣器

抽取CPU和內(nèi)存的樣例數(shù)據(jù)
設(shè)置——設(shè)置抽樣參數(shù)

CPU抽樣:

  • CPU樣例:展示了方法級(jí)別CPU性能(執(zhí)行的時(shí)間及占比)
  • 線程CPU時(shí)間:反映了線程執(zhí)行占用cpu的時(shí)間和占比

內(nèi)存抽樣

  • 堆柱狀圖:展示了內(nèi)存占用情況
  • 每個(gè)線程分配:展示了每個(gè)線程分配的內(nèi)存以及占比

5、Profile

啟動(dòng)和停止本地應(yīng)用程序的概要分析會(huì)話

CPU:點(diǎn)CPU按鈕,啟動(dòng)一個(gè) CPU性能分析會(huì)話 ,顯示 CPU 的使用率、方法的執(zhí)行效率和頻率等相關(guān)數(shù)據(jù)。

內(nèi)存:點(diǎn)擊“內(nèi)存”按鈕將啟動(dòng)一個(gè)內(nèi)存分析會(huì)話,等 VisualVM 收集和統(tǒng)計(jì)完相關(guān)性能數(shù)據(jù)信息,將會(huì)顯示在性能分析結(jié)果。

6、Visual GC

安裝插件
工具——》插件


就會(huì)出現(xiàn)Visual CG 的標(biāo)簽


參考:
https://www.cnblogs.com/baby123/p/11551626.html

https://www.iteye.com/blog/softbeta-1264833

https://www.cnblogs.com/gossip/p/6141941.html

http://www.voidcn.com/article/p-glbjjqqe-xp.html

https://my.oschina.net/yygh/blog/650507

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • jmc:Java Mission Control 使用 JMC可以監(jiān)視和管理 Java 應(yīng)用程序,不會(huì)導(dǎo)致相關(guān)工具...
    小波同學(xué)閱讀 4,328評(píng)論 0 7
  • 使用 VisualVM 進(jìn)行性能分析及調(diào)優(yōu) 概述 開(kāi)發(fā)大型 Java 應(yīng)用程序的過(guò)程中難免遇到內(nèi)存泄露、性能瓶頸等...
    Kate_Blog閱讀 11,780評(píng)論 1 1
  • ## 常見(jiàn)jvm分析工具主要是為了查錯(cuò)和進(jìn)行調(diào)優(yōu) ## 一、CLI 1、jps(java process stat...
    XLMN閱讀 2,796評(píng)論 0 1
  • VisualVM 是一款免費(fèi)的,集成了多個(gè) JDK 命令行工具的可視化工具,它能為您提供強(qiáng)大的分析能力,對(duì) Jav...
    Ag劉曉婷閱讀 883評(píng)論 0 1
  • 讓Java應(yīng)用程序運(yùn)行是一回事,但讓他們跑得快就是另外一回事了。在面對(duì)對(duì)象的環(huán)境中,性能問(wèn)題就像來(lái)勢(shì)兇猛的野獸。但...
    程序員技術(shù)圈閱讀 609評(píng)論 0 2

友情鏈接更多精彩內(nèi)容