1. 程式人生 > 實用技巧 >有了這款視覺化工具,Java 應用效能分析、調優 so easy

有了這款視覺化工具,Java 應用效能分析、調優 so easy

https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247495937&idx=1&sn=3a218db3ff445af84e3397dfa068144c&chksm=ebd5ce2ddca2473bb6baab75dc61890d22dbea9e0188b26a04ffc6403db470c2cd1a528a603f&scene=126&sessionid=1597973643&key=b2b8256ddce703217e60e4a93794eac321fc2702548a153ac2ac94ed5d6d3b60178856025a39756e69beb30022bada04b0ac2289e133ffc54aebaa6d95392b7360737a60ff38ba1fe8593be0165ace9b81cf9094585864368bffe0a45d70c4a8a78c62c42fc6dbcc8751df4c8f60e5859364130a564fb20ea853c625c86f5cbe&ascene=1&uin=MTgyMTM5NDQwMw%3D%3D&devicetype=Windows+7+x64&version=6209051e&lang=zh_CN&exportkey=AfIB%2BtxmD%2F6CY4dEvAbM61A%3D&pass_ticket=fE88cQiDKdV%2FbbwZML0a7UgpuWbKdi%2BF3NYbrA%2FzXSjvl7J%2BvDLAGMMnkRN4Nz99

JVisualVM 簡介

VisualVM 是Netbeans的profile子專案,已在JDK6.0 update 7 中自帶,能夠監控執行緒,記憶體情況,檢視方法的CPU時間和記憶體中的對 象,已被GC的物件,反向檢視分配的堆疊(如100個String物件分別由哪幾個物件分配出來的)。

在JDK_HOME/bin(預設是C:\Program Files\Java\jdk1.6.0_13\bin)目錄下面,有一個jvisualvm.exe檔案,雙擊開啟,從UI上來看,這個軟體是基於NetBeans開發的了。

VisualVM 提供了一個可視介面,用於檢視 Java 虛擬機器 (Java Virtual Machine, JVM) 上執行的基於 Java 技術的應用程式的詳細資訊。

VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟體相關資料進行組織,並通過一種使您可以快速檢視有關多個 Java 應用程式的資料的方式提供該資訊。

您可以檢視本地應用程式或遠端主機上執行的應用程式的相關資料。此外,還可以捕獲有關 JVM 軟體例項的資料,並將該資料儲存到本地系統,以供後期檢視或與其他使用者共享。

雙擊啟動 jvisualvm.exe,啟動起來後和jconsole 一樣同樣可以選擇本地和遠端,如果需要監控遠端同樣需要配置相關引數。

主介面如下;

VisualVM可以根據需要安裝不同的外掛,每個外掛的關注點都不同,有的主要監控GC,有的主要監控記憶體,有的監控執行緒等。

如何安裝:

  • 從主選單中選擇“工具”>“外掛”。
  • 在“可用外掛”標籤中,選中該外掛的“安裝”複選框。單擊“安裝”。
  • 逐步完成外掛安裝程式。

我這裡以 Eclipse(pid 22296)為例,雙擊後直接展開,主介面展示了系統和jvm兩大塊內容,點選右下方jvm引數和系統屬性可以參考詳細的引數資訊.

因為VisualVM的外掛太多,我這裡主要介紹三個我主要使用幾個:監控、執行緒、Visual GC

監控的主頁其實也就是,cpu、記憶體、類、執行緒的圖表

執行緒和jconsole功能沒有太大的區別

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

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

dump出來的執行緒快照並且進行分析等,還有其它很多的外掛大家可以去探索

案例分析

準備模擬記憶體洩漏樣例

1、定義靜態變數HashMap

2、分段迴圈建立物件,並加入HashMap

程式碼如下:

importjava.util.HashMap;
importjava.util.Map;
publicclassCyclicDependencies{
//宣告快取物件
privatestaticfinalMapmap=newHashMap();
publicstaticvoidmain(Stringargs[]){
try{
Thread.sleep(10000);//給開啟visualvm時間
}catch(InterruptedExceptione){
e.printStackTrace();
}
//迴圈新增物件到快取
for(inti=0;i<1000000;i++){
TestMemoryt=newTestMemory();
map.put("key"+i,t);
}
System.out.println("first");
//為dump出堆提供時間
try{
Thread.sleep(10000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(inti=0;i<1000000;i++){
TestMemoryt=newTestMemory();
map.put("key"+i,t);
}
System.out.println("second");
try{
Thread.sleep(10000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(inti=0;i<3000000;i++){
TestMemoryt=newTestMemory();
map.put("key"+i,t);
}
System.out.println("third");
try{
Thread.sleep(10000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(inti=0;i<4000000;i++){
TestMemoryt=newTestMemory();
map.put("key"+i,t);
}
System.out.println("forth");
try{
Thread.sleep(Integer.MAX_VALUE);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("qqqq");
}
}

3、配置jvm引數如下:

     -Xms512m
-Xmx512m
-XX:-UseGCOverheadLimit
-XX:MaxPermSize=50m

4、執行程式並打卡visualvm監控

使用JVisualVM分析記憶體洩漏

1、檢視Visual GC標籤,內容如下,這是輸出first的截圖

通過2張圖對比發現:

老生代一直在gc,當程式繼續執行可以發現老生代gc還在繼續:

增加到了7次,但是老生代的記憶體並沒有減少。說明存在無法被回收的物件,可能是記憶體洩漏了。

如何分析是那個物件洩漏了呢?開啟抽樣器標籤:點選後如下圖:

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

進入最後dump出來的堆標籤,點選類:

比較結果如下:

可以看出在兩次間隔時間內TestMemory物件例項一直在增加並且多了,說明該物件引用的方法可能存在記憶體洩漏。

如何檢視物件引用關係呢?

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

左側是建立的例項總數,右側上部為該例項的結構,下面為引用說明,從圖中可以看出在類CyclicDependencies裡面被引用了,並且被HashMap引用。

如此可以確定洩漏的位置,進而根據實際情況進行分析解決。搜尋Java知音公眾號,回覆“後端面試”,送你一份Java面試題寶典

JVisualVM 遠端監控 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

這次配置先不走許可權校驗。只是開啟jmx埠。

2、開啟jvisualvm,右鍵遠端,選擇新增遠端主機:

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

右鍵新建的主機,選擇新增JMX連線,輸入在tomcat中配置的埠即可。

4、雙擊開啟。完畢!

參考資料

https://blog.csdn.net/kl28978113/article/details/53817827 https://www.cnblogs.com/ityouknow/p/6437037.html