<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          有了這款可視化工具,Java 應(yīng)用性能調(diào)優(yōu)超簡(jiǎn)單!

          共 1669字,需瀏覽 4分鐘

           ·

          2020-11-13 19:04

          JDK常用監(jiān)控指令和監(jiān)控工具介紹及案例分析使用教程
          SpringBoot 項(xiàng)目模板:擺脫步步搭建
          推薦一款開(kāi)源的監(jiān)控預(yù)警系統(tǒng)!

          JVisualVM 簡(jiǎn)介

          VisualVM 是Netbeans的profile子項(xiàng)目,已在JDK6.0 update 7 中自帶,能夠監(jiān)控線程,內(nèi)存情況,查看方法的CPU時(shí)間和內(nèi)存中的對(duì) 象,已被GC的對(duì)象,反向查看分配的堆棧(如100個(gè)String對(duì)象分別由哪幾個(gè)對(duì)象分配出來(lái)的)。在JDK_HOME/bin(默認(rèn)是C:\Program Files\Java\jdk1.6.0_13\bin)目錄下面,有一個(gè)jvisualvm.exe文件,雙擊打開(kāi),從UI上來(lái)看,這個(gè)軟件是基于NetBeans開(kāi)發(fā)的了。


          VisualVM 提供了一個(gè)可視界面,用于查看 Java 虛擬機(jī) (Java Virtual Machine, JVM) 上運(yùn)行的基于 Java 技術(shù)的應(yīng)用程序的詳細(xì)信息。VisualVM 對(duì) Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關(guān)數(shù)據(jù)進(jìn)行組織,并通過(guò)一種使您可以快速查看有關(guān)多個(gè) 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),以供后期查看或與其他用戶共享。

          雙擊啟動(dòng) jvisualvm.exe,啟動(dòng)起來(lái)后和jconsole 一樣同樣可以選擇本地和遠(yuǎn)程,如果需要監(jiān)控遠(yuǎn)程同樣需要配置相關(guān)參數(shù)。

          主界面如下;

          VisualVM可以根據(jù)需要安裝不同的插件,每個(gè)插件的關(guān)注點(diǎn)都不同,有的主要監(jiān)控GC,有的主要監(jiān)控內(nèi)存,有的監(jiān)控線程等。

          如何安裝:

          1、從主菜單中選擇“工具”>“插件”。2、在“可用插件”標(biāo)簽中,選中該插件的“安裝”復(fù)選框。單擊“安裝”。3、逐步完成插件安裝程序。

          我這里以 Eclipse(pid 22296)為例,雙擊后直接展開(kāi),主界面展示了系統(tǒng)和jvm兩大塊內(nèi)容,點(diǎn)擊右下方j(luò)vm參數(shù)和系統(tǒng)屬性可以參考詳細(xì)的參數(shù)信息.

          因?yàn)閂isualVM的插件太多,我這里主要介紹三個(gè)我主要使用幾個(gè):監(jiān)控、線程、Visual GC

          監(jiān)控的主頁(yè)其實(shí)也就是,cpu、內(nèi)存、類、線程的圖表

          線程和jconsole功能沒(méi)有太大的區(qū)別

          Visual GC 是常常使用的一個(gè)功能,可以明顯的看到年輕代、老年代的內(nèi)存變化,以及gc頻率、gc的時(shí)間等。

          以上的功能其實(shí)jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的內(nèi)存快照,

          dump出來(lái)的線程快照并且進(jìn)行分析等,還有其它很多的插件大家可以去探索

          案例分析

          準(zhǔn)備模擬內(nèi)存泄漏樣例

          1、定義靜態(tài)變量HashMap

          2、分段循環(huán)創(chuàng)建對(duì)象,并加入HashMap

          代碼如下:

          `import?java.util.HashMap;??
          import?java.util.Map;??
          public?class?CyclicDependencies?{??
          ????//聲明緩存對(duì)象??
          ????private?static?final?Map?map?=?new?HashMap();??
          ????public?static?void?main(String?args[]){??
          ????????try?{??
          ????????????Thread.sleep(10000);//給打開(kāi)visualvm時(shí)間??
          ????????}?catch?(InterruptedException?e)?{??
          ????????????e.printStackTrace();??
          ????????}??
          ????????//循環(huán)添加對(duì)象到緩存??
          ????????for(int?i=0;?i<1000000;i++){??
          ????????????TestMemory?t?=?new?TestMemory();??
          ????????????map.put("key"+i,t);??
          ????????}??
          ????????System.out.println("first");??
          ????????//為dump出堆提供時(shí)間??
          ????????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=50m??
          `

          4、運(yùn)行程序并打卡visualvm監(jiān)控

          使用JVisualVM分析內(nèi)存泄漏

          1、查看Visual GC標(biāo)簽,內(nèi)容如下,這是輸出first的截圖

          這是輸出forth的截圖:

          通過(guò)2張圖對(duì)比發(fā)現(xiàn):

          老生代一直在gc,當(dāng)程序繼續(xù)運(yùn)行可以發(fā)現(xiàn)老生代gc還在繼續(xù):

          增加到了7次,但是老生代的內(nèi)存并沒(méi)有減少。說(shuō)明存在無(wú)法被回收的對(duì)象,可能是內(nèi)存泄漏了。

          如何分析是那個(gè)對(duì)象泄漏了呢?打開(kāi)抽樣器標(biāo)簽:點(diǎn)擊后如下圖:

          按照程序輸出進(jìn)行堆dump,當(dāng)輸出second時(shí),dump一次,當(dāng)輸出forth時(shí)dump一次。

          進(jìn)入最后dump出來(lái)的堆標(biāo)簽,點(diǎn)擊類:

          點(diǎn)擊右上角:“與另一個(gè)堆存儲(chǔ)對(duì)比”。如圖選擇第一次導(dǎo)出的dump內(nèi)容比較:

          比較結(jié)果如下:

          可以看出在兩次間隔時(shí)間內(nèi)TestMemory對(duì)象實(shí)例一直在增加并且多了,說(shuō)明該對(duì)象引用的方法可能存在內(nèi)存泄漏。

          如何查看對(duì)象引用關(guān)系呢?

          右鍵選擇類TestMemory,選擇“在實(shí)例視圖中顯示”,如下所示:

          左側(cè)是創(chuàng)建的實(shí)例總數(shù),右側(cè)上部為該實(shí)例的結(jié)構(gòu),下面為引用說(shuō)明,從圖中可以看出在類CyclicDependencies里面被引用了,并且被HashMap引用。

          如此可以確定泄漏的位置,進(jìn)而根據(jù)實(shí)際情況進(jìn)行分析解決。

          JVisualVM 遠(yuǎn)程監(jiān)控 Tomcat

          1、修改遠(yuǎn)程tomcat的catalina.sh配置文件,在其中增加:

          1. JAVA_OPTS="$JAVA_OPTS

          2. -Djava.rmi.server.hostname=192.168.122.128

          3. -Dcom.sun.management.jmxremote.port=18999

          4. -Dcom.sun.management.jmxremote.ssl=false

          5. -Dcom.sun.management.jmxremote.authenticate=false"

            這次配置先不走權(quán)限校驗(yàn)。只是打開(kāi)jmx端口。

            2、打開(kāi)jvisualvm,右鍵遠(yuǎn)程,選擇添加遠(yuǎn)程主機(jī):

          3、輸入主機(jī)的名稱,直接寫(xiě)ip,如下:

          右鍵新建的主機(jī),選擇添加JMX連接,輸入在tomcat中配置的端口即可。

          4、雙擊打開(kāi)。完畢!

          參考資料

          https://blog.csdn.net/kl28978113/article/details/53817827
          https://www.cnblogs.com/ityouknow/p/6437037.html
          來(lái)源:cnblogs.com/xifengxiaoma/p/9402497.html

          更多精彩?


          在公眾號(hào)【程序員編程】對(duì)話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          大數(shù)據(jù)?|?Java?|?1024?|?電子書(shū)?|?速查表?
          Python進(jìn)階?|?面試?|?手冊(cè)?|?成神?|?思想?|?小程序
          命令行?|?人工智能?|?軟件測(cè)試?|?Web前端?|?Python

          掃碼關(guān)注我們

          獲取更多學(xué)習(xí)資料

          視頻 |?面試 |?技術(shù) | 電子書(shū)

          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美亲子乱婬性XXX | 天天看天天插 | 黄色视频网站在线看 | 国产三级精品三级在线观看 | 亚洲人成在线观看 |