一.概述html
通過前面兩章對於虛擬機內存分配與回收技術各方面的介紹,相信讀者已經創建了一套比較完整的理論基礎。理論老是做爲指導實踐的工具,能把這些執行應用到實際工做中才是咱們的最終目的。接下來咱們會從實踐的角度去了解虛擬機內存管理的世界。java
二.JDK的命令行工具linux
Java開發人員確定都知道JDK的bin目錄中的「java.exe」、「javac.exe」這兩個命令行工具,對並不是全部程序員都瞭解JDK的bin目錄之中其餘命令行程序的做用。每逢JDK更新版本時,bin目錄下命令行工具的數量和功能都會不知不覺的增長和加強。
bin目錄以下(文中使用jdk1.8)c++
在本章中,將主要介紹這些工具中的一部分,主要包括監視虛擬機和故障處理的工具。程序員
Sun JDK監控和處理工具windows
名稱 |
主要做用 |
jps | jvm process status tool,顯示指定系統內全部的hotspot虛擬機進程瀏覽器 |
jstat | jvm statistics monitoring tool,用於收集hotspot虛擬機各方面的運行數據 |
jinfo | configuration info for java,顯示虛擬機配置信息 |
jmap | memory map for java,生成虛擬機的內存轉儲快照(heapdump文件) |
jhat | jvm heap dump browser,用於分析heapmap文件,它會創建一個http/html服務器服務器 讓用戶能夠在瀏覽器上查看分析結果eclipse |
jstack | stack trace for java ,顯示虛擬機的線程快照 |
1. jps:虛擬機進程情況工具(JVM Process Status)jvm
功能:能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class, main()函數所在的類)名稱以及這些進程的本地虛擬機惟一ID(Local Virtual Machine Identifier)。
jps命令格式:jps [options] [hostid]
jps執行樣例:
jps能夠經過RMI協議開啓了RMI服務的遠程虛擬機進程狀態,hostid爲RMI註冊表中註冊的主機名。
jps經常使用的選項:
屬性 | 做用 |
-p | 只輸出LVMID,省略主類的名稱 |
-m | 輸出虛擬機進程啓動時傳遞給主類main()函數的參數 |
-l | 輸出主類的全名,若是進程執行的是jar包,輸出jar路徑 |
-v | 輸出虛擬機進程啓動時jvm參數 |
2. jstat:虛擬機統計信息監控工具(JVM Statistics Monitoring Tool)
jstat是用於監視虛擬機各類運行狀態信息的命令行工具。它能夠顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。
jstat的命令格式: jstat [option vmid [interval [s|ms] [count]] ]
對於命令格式中的VMID和LVMID須要特別說明一下:如過是本地虛擬機進程,VMID和LVMID是一致的,若是是遠程虛擬機,那VMID的格式應當是:
[protocol:] [//] lvmid[@hostname[:port]/servername]
參數interval 和count分別表示查詢的間隔和次數,若是省略這兩個參數,說明只查詢一次。
jstat工具主要選項:
選項 | 做用 |
-class |
監視裝載類、卸載類、總空間以及類裝載所耗費的時間 |
-gc |
監視java堆情況,包括eden區、兩個survivor區、老年代、永久代等的容量、已用空間、GC時間合計信息 |
-gccapacity |
監視內容與-gc基本相同,但輸出主要關注java堆各個區域使用到最大、最小空間 |
-gcutil |
監視內容與-gc基本相同,但輸出主要關注已使用控件佔總空間的百分比 |
-gccause |
與-gcutil功能同樣,可是會額外輸出致使上一次gc產生的緣由 |
-gcnew |
監視新生代GC狀況 |
-gcnewcapacity |
監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間 |
-gcold |
監視老年代GC狀況 |
-gcoldcapacity |
監視內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間 |
-gcpermcapacity | 輸出永久代使用到的最大、最小空間 |
-compiler |
輸出JIT編譯過的方法、耗時等信息 |
-printcompilation |
輸出已經被JIT編譯過的方法 |
執行樣例:
樣例結果分析:S— Survivor區、E— Eden區、O— Old區、M— Method區(或者元數據信息(metadata))、CCS— 壓縮類空間、
YGC — 從應用程序啓動到採樣時發生 Young GC 的次數
YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)
FGC — 從應用程序啓動到採樣時發生 Full GC 的次數
FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)
GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)
3. jinfo:Java配置信息工具(Configuration Info for Java)
jinfo的做用是實時地查看和調整虛擬機各項參數。
使用jps命令的-v參數能夠查看虛擬機啓動時顯示指定的參數列表,但若是想知道未被顯式指定的參數的系統默認值,除了去找資料之外,就得使用jinfo的-flag選項。
jinfo格式: jinfo [option] pid
執行樣例:
查看全部配置:
4. jmap:Java內存映像工具(Memory Map for Java)
jmap命令用於生成堆轉儲快照(通常稱爲heapdump或dump文件)。
jmap的做用並不只僅是爲了獲取dump文件,它還能夠查詢finalize執行隊列、Java堆和永久代的詳細信息,如空間使用率、當前用的是哪一種收集器等。
和jinfo命令同樣,jmap在windows下也受到比較大的限制。除了生成dump文件的-dump選項和用於查看每一個類的實例、控件佔用統計的-histo選項在全部操做系用都提供以外,其他選項只能在linux/solaris下使用。
jmap格式: jmap [option] vmid。
主要參數選項:
選項 | 做用 |
-dump | 生成java堆轉儲快照。格式爲: -dump:[live,]format=b,file=<filename>,其中live子參數說明是否只dump出存活的對象 |
-finalizerinfo | 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象。只在Linux/Solaris平臺下有效 |
-heap | 顯示java堆詳細信息,如使用哪一種收集器、參數配置、分代狀況等,在Linux/Solaris平臺下有效 |
-histo | 顯示堆中對象統計信息,包含類、實例對象、合集容量 |
-permstat | 以ClassLoader爲統計口徑顯示永久代內存狀態。只在Linux/Solaris平臺下有效 |
-F | 當虛擬機進程對-dump選項沒有相應時。可以使用這個選項強制生成dump快照。只在Linux/Solaris平臺下有效 |
執行樣例:
5. jhat:虛擬機堆轉儲快照分析工具(JVM Heap Analysis Tool)
jhat命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。
jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,能夠在瀏覽器中查看。
執行樣例: 生成虛擬機堆轉儲快照文件 eclipse.bin ,再jhat分析;
當出現 Server is ready時,訪問 localhost:7000 ,能夠看到分析結果: ctrl+c 結束。
6. jstack:Java堆棧跟蹤工具(Stack Trace for Java)
jstack命令用於生成虛擬機當前時刻的線程快照(通常稱爲threaddump 或者 javacore文件)。
線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等都是致使線程長時間停頓的常見緣由。
jstack 格式: jstack [option] vmid。
option選項的合法值和具體含義:
選項 | 做用 |
-F | 當正常輸出的請求不被響應時,強制輸出線程堆棧 |
-l | 除堆棧外,顯示關於鎖的附加信息 |
-m | 若是調用到本地方法的話,能夠顯示c/c++的堆棧 |
執行樣例:
三.JDK的可視化工具
JDK中除了提供大量的命令行工具外,還有兩個功能強大的可視化工具:JConsole 和 VisualVM。
1. JConsole:Java監視與管理控制檯
1.1 啓動JConsole
經過JDK/bin目錄下的「jconsole.exe」啓動JConsole後,將自動搜索出本機運行的全部虛擬機進程,不須要本身再使用jps來查詢了。如圖:
主要有6個頁籤:
沒有太多須要介紹的地方;本身啓動起來作幾個小測試吧。
2. VisualVM:多合一故障處理工具
VisualVM是到目前爲止隨JDK發佈的功能最強大的運行監視和故障處理程序。(官方描述「All in One」)。
VisualVM能夠作到:
啓動:經過JDK/bin目錄下的「jvisualvm.exe」啓動VisualVM。看一下界面:
詳細功能本身去摸索。在這裏講一下,VisualVM安裝插件。
本章內容更多須要本身動手執行,能夠嘗試這查看正在作的項目的JVM數據。