Java 应用性能调优,可视化工具
??
點(diǎn)擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號
重磅資訊、干貨,第一時間送達(dá) 今日推薦:終于放棄了單調(diào)的swagger-ui了,選擇了這款神器—knife4j個人原創(chuàng)+1博客:點(diǎn)擊前往,查看更多JVisualVM 簡介
案例分析
準(zhǔn)備模擬內(nèi)存泄漏樣例
使用JVisualVM分析內(nèi)存泄漏
JVisualVM 遠(yuǎn)程監(jiān)控 Tomcat
JVisualVM 簡介
VisualVM 是Netbeans的profile子項目,已在JDK6.0 update 7 中自帶,能夠監(jiān)控線程,內(nèi)存情況,查看方法的CPU時間和內(nèi)存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的)。在JDK_HOME/bin(默認(rèn)是C:\Program Files\Java\jdk1.6.0_13\bin)目錄下面,有一個jvisualvm.exe文件,雙擊打開,從UI上來看,這個軟件是基于NetBeans開發(fā)的了。
VisualVM 提供了一個可視界面,用于查看 Java 虛擬機(jī) (Java Virtual Machine, JVM) 上運(yùn)行的基于 Java 技術(shù)的應(yīng)用程序的詳細(xì)信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關(guān)數(shù)據(jù)進(jìn)行組織,并通過一種使您可以快速查看有關(guān)多個 Java 應(yīng)用程序的數(shù)據(jù)的方式提供該信息。您可以查看本地應(yīng)用程序或遠(yuǎn)程主機(jī)上運(yùn)行的應(yīng)用程序的相關(guān)數(shù)據(jù)。此外,還可以捕獲有關(guān) JVM 軟件實(shí)例的數(shù)據(jù),并將該數(shù)據(jù)保存到本地系統(tǒng),以供后期查看或與其他用戶共享。
附上我歷時三個月總結(jié)的?Java面試思維導(dǎo)圖,拿去不謝!
下載方式
1.?首先掃描下方二維碼
2.?后臺回復(fù)「思維導(dǎo)圖」即可獲取
雙擊啟動 jvisualvm.exe,啟動起來后和jconsole 一樣同樣可以選擇本地和遠(yuǎn)程,如果需要監(jiān)控遠(yuǎn)程同樣需要配置相關(guān)參數(shù)。
主界面如下;
VisualVM可以根據(jù)需要安裝不同的插件,每個插件的關(guān)注點(diǎn)都不同,有的主要監(jiān)控GC,有的主要監(jiān)控內(nèi)存,有的監(jiān)控線程等。
如何安裝:
1、從主菜單中選擇“工具”>“插件”。2、在“可用插件”標(biāo)簽中,選中該插件的“安裝”復(fù)選框。單擊“安裝”。3、逐步完成插件安裝程序。
我這里以 Eclipse(pid 22296)為例,雙擊后直接展開,主界面展示了系統(tǒng)和jvm兩大塊內(nèi)容,點(diǎn)擊右下方j(luò)vm參數(shù)和系統(tǒng)屬性可以參考詳細(xì)的參數(shù)信息.
因為VisualVM的插件太多,我這里主要介紹三個我主要使用幾個:監(jiān)控、線程、Visual GC
監(jiān)控的主頁其實(shí)也就是,cpu、內(nèi)存、類、線程的圖表
線程和jconsole功能沒有太大的區(qū)別
Visual GC 是常常使用的一個功能,可以明顯的看到年輕代、老年代的內(nèi)存變化,以及gc頻率、gc的時間等。
以上的功能其實(shí)jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的內(nèi)存快照,
dump出來的線程快照并且進(jìn)行分析等,還有其它很多的插件大家可以去探索
案例分析
準(zhǔn)備模擬內(nèi)存泄漏樣例
1、定義靜態(tài)變量HashMap
2、分段循環(huán)創(chuàng)建對象,并加入HashMap
代碼如下:
import?java.util.HashMap; import?java.util.Map; public?class?CyclicDependencies?{//聲明緩存對象private?static?final?Map?map?=?new?HashMap();public?static?void?main(String?args[]){try?{Thread.sleep(10000);//給打開visualvm時間}?catch?(InterruptedException?e)?{e.printStackTrace();}//循環(huán)添加對象到緩存for(int?i=0;?i<1000000;i++){TestMemory?t?=?new?TestMemory();map.put("key"+i,t);}System.out.println("first");//為dump出堆提供時間try?{Thread.sleep(10000);}?catch?(InterruptedException?e)?{e.printStackTrace();}for(int?i=0;?i<1000000;i++){TestMemory?t?=?new?TestMemory();map.put("key"+i,t);}System.out.println("second");try?{Thread.sleep(10000);}?catch?(InterruptedException?e)?{e.printStackTrace();}for(int?i=0;?i<3000000;i++){TestMemory?t?=?new?TestMemory();map.put("key"+i,t);}System.out.println("third");try?{Thread.sleep(10000);}?catch?(InterruptedException?e)?{e.printStackTrace();}for(int?i=0;?i<4000000;i++){TestMemory?t?=?new?TestMemory();map.put("key"+i,t);}System.out.println("forth");try?{Thread.sleep(Integer.MAX_VALUE);}?catch?(InterruptedException?e)?{e.printStackTrace();}System.out.println("qqqq");} }3、配置jvm參數(shù)如下:
?????????-Xms512m-Xmx512m-XX:-UseGCOverheadLimit-XX:MaxPermSize=50m4、運(yùn)行程序并打卡visualvm監(jiān)控
使用JVisualVM分析內(nèi)存泄漏
1、查看Visual GC標(biāo)簽,內(nèi)容如下,這是輸出first的截圖
這是輸出forth的截圖:
通過2張圖對比發(fā)現(xiàn):
老生代一直在gc,當(dāng)程序繼續(xù)運(yùn)行可以發(fā)現(xiàn)老生代gc還在繼續(xù):
增加到了7次,但是老生代的內(nèi)存并沒有減少。說明存在無法被回收的對象,可能是內(nèi)存泄漏了。
如何分析是那個對象泄漏了呢?打開抽樣器標(biāo)簽:點(diǎn)擊后如下圖:
按照程序輸出進(jìn)行堆dump,當(dāng)輸出second時,dump一次,當(dāng)輸出forth時dump一次。
進(jìn)入最后dump出來的堆標(biāo)簽,點(diǎn)擊類:
點(diǎn)擊右上角:“與另一個堆存儲對比”。如圖選擇第一次導(dǎo)出的dump內(nèi)容比較:
比較結(jié)果如下:
可以看出在兩次間隔時間內(nèi)TestMemory對象實(shí)例一直在增加并且多了,說明該對象引用的方法可能存在內(nèi)存泄漏。
如何查看對象引用關(guān)系呢?
右鍵選擇類TestMemory,選擇“在實(shí)例視圖中顯示”,如下所示:
左側(cè)是創(chuàng)建的實(shí)例總數(shù),右側(cè)上部為該實(shí)例的結(jié)構(gòu),下面為引用說明,從圖中可以看出在類CyclicDependencies里面被引用了,并且被HashMap引用。
如此可以確定泄漏的位置,進(jìn)而根據(jù)實(shí)際情況進(jìn)行分析解決。
JVisualVM 遠(yuǎn)程監(jiān)控 Tomcat
1、修改遠(yuǎn)程tomcat的catalina.sh配置文件,在其中增加:
JAVA_OPTS="$JAVA_OPTS
-Djava.rmi.server.hostname=192.168.122.128
-Dcom.sun.management.jmxremote.port=18999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
這次配置先不走權(quán)限校驗。只是打開jmx端口。
2、打開jvisualvm,右鍵遠(yuǎn)程,選擇添加遠(yuǎn)程主機(jī):
3、輸入主機(jī)的名稱,直接寫ip,如下:
右鍵新建的主機(jī),選擇添加JMX連接,輸入在tomcat中配置的端口即可。
4、雙擊打開。完畢!
參考資料
https://blog.csdn.net/kl28978113/article/details/53817827
https://www.cnblogs.com/ityouknow/p/6437037.html
來源:朝雨憶輕塵
cnblogs.com/xifengxiaoma/p/9402497.html
最后,再附上我歷時三個月總結(jié)的?Java 面試 + Java 后端技術(shù)學(xué)習(xí)指南,這是本人這幾年及春招的總結(jié),目前,已經(jīng)拿到了大廠offer,拿去不謝!
下載方式
1.?首先掃描下方二維碼
2.?后臺回復(fù)「Java面試」即可獲取
總結(jié)
以上是生活随笔為你收集整理的Java 应用性能调优,可视化工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干掉 Navicat:这个 IDEA 的
- 下一篇: java美元兑换,(Java实现) 美元