<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>

          JVM性能調優(yōu),程序員進階必看!

          共 1721字,需瀏覽 4分鐘

           ·

          2020-12-27 22:16


          點擊上方?藍字?關注我們!



          老家浙江東海邊,靠海吃海,目前經(jīng)營一個小品牌,讓普通人吃到最新鮮的海鮮。有興趣可以點擊了解:《浙里有漁,鮮人一步!》???

          • JVisualVM 簡介
          • 案例分析
            • 準備模擬內存泄漏樣例
            • 使用JVisualVM分析內存泄漏
            • JVisualVM 遠程監(jiān)控 Tomcat

          JVisualVM 簡介

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

          VisualVM 提供了一個可視界面,用于查看 Java 虛擬機 (Java Virtual Machine, JVM) 上運行的基于 Java 技術的應用程序的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關數(shù)據(jù)進行組織,并通過一種使您可以快速查看有關多個 Java 應用程序的數(shù)據(jù)的方式提供該信息。您可以查看本地應用程序或遠程主機上運行的應用程序的相關數(shù)據(jù)。此外,還可以捕獲有關 JVM 軟件實例的數(shù)據(jù),并將該數(shù)據(jù)保存到本地系統(tǒng),以供后期查看或與其他用戶共享。

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

          主界面如下;

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

          如何安裝:

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

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

          因為VisualVM的插件太多,我這里主要介紹三個我主要使用幾個:監(jiān)控、線程、Visual GC

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

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

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

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

          dump出來的線程快照并且進行分析等,還有其它很多的插件大家可以去探索

          案例分析

          準備模擬內存泄漏樣例

          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=50m

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

          使用JVisualVM分析內存泄漏

          1、查看Visual GC標簽,內容如下,這是輸出first的截圖

          這是輸出forth的截圖:

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

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

          增加到了7次,但是老生代的內存并沒有減少。說明存在無法被回收的對象,可能是內存泄漏了。

          如何分析是那個對象泄漏了呢?打開抽樣器標簽:點擊后如下圖:

          按照程序輸出進行堆dump,當輸出second時,dump一次,當輸出forth時dump一次。

          進入最后dump出來的堆標簽,點擊類:

          點擊右上角:“與另一個堆存儲對比”。如圖選擇第一次導出的dump內容比較:

          比較結果如下:

          可以看出在兩次間隔時間內TestMemory對象實例一直在增加并且多了,說明該對象引用的方法可能存在內存泄漏。

          如何查看對象引用關系呢?

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

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

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

          JVisualVM 遠程監(jiān)控 Tomcat


          1、修改遠程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"

            這次配置先不走權限校驗。只是打開jmx端口。

          2、打開jvisualvm,右鍵遠程,選擇添加遠程主機:

          3、輸入主機的名稱,直接寫ip,如下:

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

          4、雙擊打開。完畢!

          老家浙江東海邊,靠海吃海,目前經(jīng)營一個小品牌,讓普通人吃到最新鮮的海鮮。有興趣可以點擊了解:《浙里有漁,鮮人一步!》???


          END



          若覺得文章對你有幫助,隨手轉發(fā)分享,也是我們繼續(xù)更新的動力。


          長按二維碼,掃掃關注哦

          ?「C語言中文網(wǎng)」官方公眾號,關注手機閱讀教程??


          必備編程學習資料


          目前收集的資料包括:?Java,Python,C/C++,Linux,PHP,go,C#,QT,git/svn,人工智能,大數(shù)據(jù),單片機,算法,小程序,易語言,安卓,ios,PPT,軟件教程,前端,軟件測試,簡歷,畢業(yè)設計,公開課?等分類,資源在不斷更新中...


          點擊“閱讀原文”,立即免費領取最新資料!
          ???
          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  一级A级黄色片 | 可以免费看的黄色片 | 91 丝袜一区二区 | 国产麻豆网 | av亚洲国产电影在线观看 |