jmap與jstat工具實戰分析


在上一節【https://www.cnblogs.com/webor2006/p/10662363.html】最后其實是拋出了infoq關於元空間介紹的文章中所涉及到JDK自帶的一些工具的使用,這次咱們來親自來對文中提到的jmap和jstat工具進行實踐,如下:

對於JDK自帶的工具其實主要是分為兩種:一種是命令行工具,另一種是GUI工具,其實GUI工具也就是對命令行工具的一個集成,那既然有了GUI工具還要什么命令行工具呢?其實現實是有些系統是不支持GUI的,所以對於命令行工具的掌握也是很有必要的。

jmap:

如InfoQ文章中所介紹的,它是用來查看類加載器數據的,當然也介紹了它的使用,不過咱們以純小白的方式來看一下該命令的使用方式,當然是直接在命令行看一下它官方的使用幫助嘍:

所以,為了演練該命令,咱們寫一個簡單的程序,然后里面寫一個死循環來保持進程是活着,如下:

運行起來:

由於jmap需要知道進程ID,所以可以利用linux的這個稍復雜的命令來查看之,如下:

然后查到咱們程序相關的進程ID:

當然這種獲取JVM進程的方式稍顯復雜,其實有更加簡便的命令來獲取的,這個在之后會使用到,接下來我們使用一下該命令:

報異常了,不能連接到指定的進程,而且可以看到我們的IntelliJ IDEA的這個死循環的程序也掛掉了:

其實這是跟我機器上的當前版本有關,算是一個BUG,因為google官方對其有解釋:

不過咱們不使用JDK9,而是使用JDK8往前的小版本既可,先來查看一下當前機器使用的JDK版本,如下:

其實使用92這個小版本就可以了,所以這里先將IntelliJ IDEA的JDK切到92這個版本,如下:

然后再次運行:

此時的jmap就得用92這個jdk的了,由於我當前path配的是171這個,為了方便我們直接進入到92這個版本的目錄來執行jmap命令,如下:

此時注意一下執行此命令時會讓程序停止運行一會,如下:

很明顯能看到在計算時進程的輸出卡住了,待jmap計算完成之后進程運行才恢復,下面來具體看一下該進程的類加載器的輸出:

咱們來瞅下這個自定義的類加載器:

最后就是加載我們MyTest5類的應用類加載器了:

從這個輸出再一次鞏固了之前我們學習類加載器的相關知識,有了這個命令就可以直觀當前進程運行的類加載器的關系了,還是很好用的。

另外jmap還有另一個參數,如下:

下面來使用一下:

xiongweideMacBook-Pro:classes xiongwei$ /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin/jmap -heap 11971
Attaching to process ID 11971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 715653120 (682.5MB)
   OldSize                  = 89653248 (85.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 34078720 (32.5MB)
   used     = 3408368 (3.2504730224609375MB)
   free     = 30670352 (29.249526977539062MB)
   10.001455453725962% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 89653248 (85.5MB)
   used     = 0 (0.0MB)
   free     = 89653248 (85.5MB)
   0.0% used

2154 interned Strings occupying 152240 bytes.
xiongweideMacBook-Pro:classes xiongwei$ 

下面簡單來瞅一下輸出:

以上是關於jmap常用的用法。

jstat: 

如文章中所示:

所以咱們來使用一下,進程還是之前那個進程,因為死循環我木有退出,然后看一下它的官方用法介紹:

咱們按照文章中所列的用法執行一下:

其中如文章中所示,重點看MC和MU這兩參數,其中MC的注釋為:Current Metaspace Capacity(KB)當前元空間容量,也就是系統所分配的空間;MU為:Metaspace Utilization(KB)已經被使用元空間的大小,回到咱們程序來說:系統分配的元空間大小為4480kb,而當前已經使用的元空間的大小為773.9kb,而且有個細節,就是我們不斷執行該命令,其MU基本上沒有變化,如下:

這是因為咱們這個程序木有使用到元空間,如下:

而如之前所學,只有動態創建的類的信息才會往元空間當中存,所以咱們停止此程序,換之前的cglib程序,然后再來實驗一下:

此時再來多次運行jstat命令,看MU是不是在不斷變化:

嗯~~該命令還是很不錯的~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM