標籤:lvm 選中 inf src images clip 遠程監控 key 結果
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,有的主要監控記憶體,有的監控線程等。
如何安裝:
1、從主菜單中選擇“工具”>“外掛程式”。
2、在“可用外掛程式”標籤中,選中該外掛程式的“安裝”複選框。單擊“安裝”。
3、逐步完成外掛程式安裝程式。
我這裡以 Eclipse(pid 22296)為例,雙擊後直接展開,主介面展示了系統和jvm兩大塊內容,點擊右下方jvm參數和系統屬性可以參考詳細的參數資訊.
因為VisualVM的外掛程式太多,我這裡主要介紹三個我主要使用幾個:監控、線程、Visual GC
監控的首頁其實也就是,cpu、記憶體、類、線程的圖表
線程和jconsole功能沒有太大的區別
Visual GC 是常常使用的一個功能,可以明顯的看到年輕代、老年代的記憶體變化,以及gc頻率、gc的時間等。
以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM非常多的其它功能,可以分析dump的記憶體快照,
dump出來的線程快照並且進行分析等,還有其它很多的外掛程式大家可以去探索
案例分析準備類比記憶體流失範例1、定義靜態變數HashMap2、分段迴圈建立對象,並加入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(); } //迴圈添加對象到緩衝 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參數如下:
-Xms512m -Xmx512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=50m
4、運行程式並打卡visualvm監控使用JVisualVM分析記憶體流失 1、查看Visual GC標籤,內容如下,這是輸出first的 這是輸出forth的: 通過2張圖對比發現: 老生代一直在gc,當程式繼續運行可以發現老生代gc還在繼續: 增加到了7次,但是老生代的記憶體並沒有減少。說明存在無法被回收的對象,可能是記憶體流失了。如何分析是那個對象泄漏了呢?開啟抽樣器標籤:點擊後如: 按照程式輸出進行堆dump,當輸出second時,dump一次,當輸出forth時dump一次。進入最後dump出來的堆標籤,點擊類:點擊右上方:“與另一個堆儲存對比”。選擇第一次匯出的dump內容比較: 比較結果如下: 可以看出在兩次間隔時間內TestMemory對象執行個體一直在增加並且多了,說明該對象引用的方法可能存在記憶體流失。如何查看對象參考關聯性呢?右鍵選擇類TestMemory,選擇“在執行個體視圖中顯示”,如下所示: 左側是建立的執行個體總數,右側上部為該執行個體的結構,下面為引用說明,可以看出在類CyclicDependencies裡面被引用了,並且被HashMap引用。如此可以確定泄漏的位置,進而根據實際情況進行分析解決。 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、雙擊開啟。完畢!
參考資料
53817827
https://www.cnblogs.com/ityouknow/p/6437037.html
Java效能調優:利用VisualVM進行效能分析