歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

JAVA程序員養成計劃之JVM學習筆記(3)-JVM性能監控

1. JDK命令行工具

1.1. jps:虛擬機進程狀況工具

JVM Process Status Tool, 顯示系統內所有的HotSpot虛擬機進程,用於查看當前在jvm中運行的程序,包括虛擬機執行主類的名稱以及進程ID。

1.2. jstat:虛擬機統計信息監視工具

JVM Statistics Monitoring Tool, 用於收集Hotspot虛擬機各方面的運行數據,包括類裝載、內存、垃圾收集、JIT編譯等運行數據。

1.3. jinfo:Java配置信息工具

Configuration Info for Java, 顯示虛擬機配置信息。可以實時的查看和調整虛擬機各項參數,即VM參數。

1.4. jmap:Java內存映像工具

Memory Map for Java,生成虛擬機的內存轉儲快照(heapdump文件),查看Finalizer線程執行finalize方法的對象,顯示堆的詳細信息(如回收器、參數配置、分代狀況等),顯示堆中對象的統計信息(對象數量,類數量,合計容量等)等等,不過只有存儲快照可以在windows下運行。另外,還有其他的生成方法為通過VM參數-XX:+HeapDumpOnOutOfMemoryError,可以在出現OOM異常時候生成dump文件。

1.5. jhat:虛擬機堆存儲快照分析工具

JVM Heap Analysis Tool,與jmap搭配使用,用於分析heapdump文件,會建立一個HTTP/HTML服務器,讓用戶可以在浏覽器上查看分析結果。

1.6. jstack:Java堆棧跟蹤工具

Stack Trace for Java,顯示虛擬機當前時刻的線程快照,也稱為threaddump或javacore文件。即每一條線程正在執行的方法堆棧的集合,通過該命令一般用於檢測線程長時間停頓原因,死鎖,死循環,請求外部資源等待等導致線程長時間停頓的原因。

2. JDK的可視化工具

2.1. JConsole

位於JDK/bin目錄下,啟動後可以自動搜索出本機運行的所有虛擬機進程,然後可以進行選擇一個進程進行監控。

 

jconsole-新建連接

 

這裡寫了個生產者消費者的代碼用於測試,也就是PCTest,共有3個生產者和3個消費者,每次生產的節點都有一個byte[1024]用於占內存。連接之後,可以看到概述,然後每個頁面也可以看到具體的相關信息:

 

jconsole-概述

 

可以通過查看內存情況各個區的分配情況,來對vm參數進行配置調整

 

jconsole-內存

 

在線程頁面,也可以看到每個線程的運行情況,如運行狀態,等待的鎖,持有的鎖等等,也可以檢測死鎖情況

 

jconsole-線程

 

2.2. VisualVM

位於JDK/bin目錄下,啟動後可以自動搜索出本機運行的所有虛擬機進程,然後可以進行選擇一個進程進行監控。

VisualVM功能和jconsole差不太多,不過提供了一個更為好看的界面,這是啟動時各個進程的情況。

 

VisualVM-開始

 

VisualVM提供和jconsole一樣的對內存使用情況的概述,以及線程情況的概述

 

VisualVM-內存情況

 

 

VisualVM-線程情況

 

還有其他一些功能,這裡就不在贅述。

3. 其他

3.1 Eclipse Memory Analyzer

Eclipse Memory Analyzer與前面兩者相比,提供了更為細節的分析,包括引用鏈的情況,各個線程、對象占據的內存等等。

首先需要安裝Eclipse Memory Analyzer插件,通過Eclipse的Install from site進行安裝,如圖所示:

 

MAT安裝

 

還是用生產者消費者程序作為樣例,配置好以下jvm參數:

-Xmx10m -Xms10m -XX:+HeapDumpOnOutOfMemoryError

為了更快的發生內存溢出,也將每個節點的內存設置為了1M大小,程序運行之後,很快就發生了OOM錯誤

 

OOM

 

從上面可以看出,內存溢出的時候,生成了堆存儲快照

Dumping heap to java_pid8056.hprof …

然後在工程目錄下,可以看到該堆存儲快照

 

堆快照

 

直接雙擊打開,可以選擇默認的讓插件自己進行可疑內存洩露分析,根據堆的大小,在一定時間內會出結果,如下:

 

堆存儲快照

 

這是堆中各個線程的使用內存的情況,在這個之下,還有插件分析的結果:

 

分析結果-1

 

通過Details信息,可以查看具體的信息

 

分析結果-2

 

這裡面shallow heap代表對象本身所占的空間,retained heap代表如果把這個對象給gc了,可以收回多少空間

4.參考資料

[1]《深入理解Java虛擬機》第二版,周志明著

Copyright © Linux教程網 All Rights Reserved