<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 性能調(diào)優(yōu)的可視化工具,你真的會用嗎?

          共 6754字,需瀏覽 14分鐘

           ·

          2022-07-30 12:31

          點擊關(guān)注公眾號:互聯(lián)網(wǎng)架構(gòu)師,后臺回復 2T獲取2TB學習資源!

          上一篇:Alibaba開源內(nèi)網(wǎng)高并發(fā)編程手冊.pdf

          JVisualVM 簡介

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

          VisualVM 提供了一個可視界面,用于查看 Java 虛擬機上運行的基于 Java 技術(shù)的應用程序的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關(guān)數(shù)據(jù)進行組織,并通過一種使您可以快速查看有關(guān)多個 Java 應用程序的數(shù)據(jù)的方式提供該信息。

          您可以查看本地應用程序或遠程主機上運行的應用程序的相關(guān)數(shù)據(jù)。此外,還可以捕獲有關(guān) JVM 軟件實例的數(shù)據(jù),并將該數(shù)據(jù)保存到本地系統(tǒng),以供后期查看或與其他用戶共享。

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

          主界面如下:

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

          如何安裝:

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

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

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

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

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

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

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

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

          案例分析

          準備模擬內(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=50m

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

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

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

          這是輸出forth的截圖:

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

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

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

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

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

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

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

          比較結(jié)果如下:

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

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

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

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

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

          JVisualVM 遠程監(jiān)控 Tomcat

          1、修改遠程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,右鍵遠程,選擇添加遠程主機:

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

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

          4、雙擊打開。完畢!

          來源:cnblogs.com/xifengxiaoma/p/9402497.html

          -End-

          最后,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復:2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.全新 IDEA 2022.2 正式發(fā)布,新特性真香!

          2.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧

          3.程序員一般可以從什么平臺接私活?

          4.Spring中毒太深,離開Spring我連最基本的CRUD都不會寫了...

          5.為什么國內(nèi) 996 干不過國外的 955呢?

          6.中國的鐵路訂票系統(tǒng)在世界上屬于什么水平?                        

          7.15張圖看懂瞎忙和高效的區(qū)別!


          瀏覽 32
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  成人免费视频 国产免费麻豆, | 初尝人妻滑进去了 | 中文无码熟妇人妻AV在线 | 亚洲无码 高清视频 | 国产av最新福利 国产jk在线观看 |