1. 程式人生 > >動態檢視JVM記憶體的工具

動態檢視JVM記憶體的工具

JAVA JPS 命令詳解

JPS 名稱: jps - Java Virtual Machine Process Status Tool

命令用法: jps [options] [hostid]

              options:命令選項,用來對輸出格式進行控制

              hostid:指定特定主機,可以是ip地址和域名, 也可以指定具體協議,埠。

              [protocol:][[//]hostname][:port][/servername]

功能描述: jps是用於檢視有權訪問的hotspot虛擬機器的程序. 當未指定hostid時,預設檢視本機jvm程序,否者檢視指定的hostid機器上的jvm程序,此時hostid所指機器必須開啟jstatd服務。 jps可以列出jvm程序lvmid,主類類名,main函式引數, jvm引數,jar名稱等資訊。

命令選項及功能:

沒新增option的時候,預設列出VM標示符號和簡單的class或jar名稱.如下:

å¾çå·²ç»æå :<

-p  :僅僅顯示VM 標示,不顯示jar,class, main引數等資訊.

å¾çå·²ç»æå :<

-m:輸出主函式傳入的引數. 下的hello 就是在執行程式時從命令列輸入的引數

å¾çå·²ç»æå :<

-l: 輸出應用程式主類完整package名稱或jar完整名稱.

å¾çå·²ç»æå :<

-v: 列出jvm引數, -Xms20m -Xmx50m是啟動程式指定的jvm引數

å¾çå·²ç»æå :<

-V: 輸出通過.hotsportrc或-XX:Flags=<filename>指定的jvm引數

-Joption:傳遞引數到javac 呼叫的java lancher.

jstat命令使用

jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。命令的格式如下:

jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]

類載入統計:

C:\Users\Administrator>jstat -class 2060

Loaded Bytes Unloaded Bytes Time

15756 17355.6 0 0.0 11.29

  • Loaded:載入class的數量
  • Bytes:所佔用空間大小
  • Unloaded:未載入數量
  • Bytes:未載入佔用空間
  • Time:時間

編譯統計

C:\Users\Administrator>

jstat -compiler 2060

Compiled Failed Invalid Time FailedType FailedMethod

9142 1 0 5.01 1 org/apache/felix/resolver/ResolverImpl mergeCandidatePackages

  • Compiled:編譯數量。
  • Failed:失敗數量
  • Invalid:不可用數量
  • Time:時間
  • FailedType:失敗型別
  • FailedMethod:失敗的方法

垃圾回收統計

C:\Users\Administrator>jstat -gc 2060

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT

20480.0 20480.0 0.0 13115.3 163840.0 113334.2 614400.0 436045.7 63872.0 61266.5 0.0 0.0 149 3.440 8 0.295 3.735

  • S0C:第一個倖存區的大小
  • S1C:第二個倖存區的大小
  • S0U:第一個倖存區的使用大小
  • S1U:第二個倖存區的使用大小
  • EC:伊甸園區的大小
  • EU:伊甸園區的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法區大小
  • MU:方法區使用大小
  • CCSC:壓縮類空間大小
  • CCSU:壓縮類空間使用大小
  • YGC:年輕代垃圾回收次數
  • YGCT:年輕代垃圾回收消耗時間
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

堆記憶體統計

C:\Users\Administrator>jstat -gccapacity 2060

NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC

CCSMN CCSMX CCSC YGC FGC

204800.0 204800.0 204800.0 20480.0 20480.0 163840.0 614400.0 614400.0 614400.0 614400.0 0.0 63872.0 63872.0 0.0 0.0 0.0 149 8

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:當前新生代容量
  • S0C:第一個倖存區大小
  • S1C:第二個倖存區的大小
  • EC:伊甸園區的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:當前老年代大小
  • OC:當前老年代大小
  • MCMN:最小元資料容量
  • MCMX:最大元資料容量
  • MC:當前元資料空間大小
  • CCSMN:最小壓縮類空間大小
  • CCSMX:最大壓縮類空間大小
  • CCSC:當前壓縮類空間大小
  • YGC:年輕代gc次數
  • FGC:老年代GC次數

新生代垃圾回收統計

C:\Users\Administrator>jstat -gcnew 7172

S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT

40960.0 40960.0 25443.1 0.0 15 15 20480.0 327680.0 222697.8 12 0.736

  • S0C:第一個倖存區大小
  • S1C:第二個倖存區的大小
  • S0U:第一個倖存區的使用大小
  • S1U:第二個倖存區的使用大小
  • TT:物件在新生代存活的次數
  • MTT:物件在新生代存活的最大次數
  • DSS:期望的倖存區大小
  • EC:伊甸園區的大小
  • EU:伊甸園區的使用大小
  • YGC:年輕代垃圾回收次數
  • YGCT:年輕代垃圾回收消耗時間

新生代記憶體統計

C:\Users\Administrator>jstat -gcnewcapacity 7172

NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC

409600.0 409600.0 409600.0 40960.0 40960.0 40960.0 40960.0 327680.0 327680.0 12 0

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:當前新生代容量
  • S0CMX:最大幸存1區大小
  • S0C:當前倖存1區大小
  • S1CMX:最大幸存2區大小
  • S1C:當前倖存2區大小
  • ECMX:最大伊甸園區大小
  • EC:當前伊甸園區大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代回收次數

老年代垃圾回收統計

C:\Users\Administrator>jstat -gcold 7172

MC MU CCSC CCSU OC OU YGC FGC FGCT GCT

33152.0 31720.8 0.0 0.0 638976.0 184173.0 12 0 0.000 0.736

  • MC:方法區大小
  • MU:方法區使用大小
  • CCSC:壓縮類空間大小
  • CCSU:壓縮類空間使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

老年代記憶體統計

C:\Users\Administrator>jstat -gcoldcapacity 7172

OGCMN OGCMX OGC OC YGC FGC FGCT GCT

638976.0 638976.0 638976.0 638976.0 12 0 0.000 0.736

  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:當前老年代大小
  • OC:老年代大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

元資料空間統計

C:\Users\Administrator>jstat -gcmetacapacity 7172

MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT

0.0 33152.0 33152.0 0.0 0.0 0.0 12 0 0.000 0.736

  • MCMN:最小元資料容量
  • MCMX:最大元資料容量
  • MC:當前元資料空間大小
  • CCSMN:最小壓縮類空間大小
  • CCSMX:最大壓縮類空間大小
  • CCSC:當前壓縮類空間大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

總結垃圾回收統計

C:\Users\Administrator>jstat -gcutil 7172

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

62.12 0.00 81.36 28.82 95.68 - 12 0.736 0 0.000 0.736

  • S0:倖存1區當前使用比例
  • S1:倖存2區當前使用比例
  • E:伊甸園區使用比例
  • O:老年代使用比例
  • M:元資料區使用比例
  • CCS:壓縮使用比例
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

JVM編譯方法統計

C:\Users\Administrator>jstat -printcompilation 7172

Compiled Size Type Method

4608 16 1 org/eclipse/emf/common/util/SegmentSequence$SegmentSequencePool$SegmentsAccessUnit reset

  • Compiled:最近編譯方法的數量
  • Size:最近編譯方法的位元組碼數量
  • Type:最近編譯方法的編譯型別。
  • Method:方法名標識。

Jmap命令

如果想分析自己的JAVA Application時,可以使用jmap程式來生成heapdump文例:

-heap:列印heap空間的概要,這裡可以粗略的檢驗heap空間的使用情況。

例:

jmap -heap 12345

輸出:

Attaching to process ID 2657, please wait...

Debugger attached successfully.

Client compiler detected.

JVM version is 1.5.0_16-b02

using thread-local object allocation.

Mark Sweep Compact GC

Heap Configuration:

   MinHeapFreeRatio = 40

   MaxHeapFreeRatio = 70

   MaxHeapSize      = 67108864 (64.0MB)

   NewSize          = 655360 (0.625MB)

   MaxNewSize       = 4294901760 (4095.9375MB)

   OldSize          = 1441792 (1.375MB)

   NewRatio         = 12

   SurvivorRatio    = 8

   PermSize         = 8388608 (8.0MB)

   MaxPermSize      = 67108864 (64.0MB)

Heap Usage:

New Generation (Eden + 1 Survivor Space):----------------------------------------新生代區

   capacity = 4521984 (4.3125MB)

   used     = 1510200 (1.4402389526367188MB)

   free     = 3011784 (2.8722610473632812MB)

   33.39684527853261% used

Eden Space:--------------------------------------------------------------------伊甸園區

   capacity = 4063232 (3.875MB)

   used     = 1495992 (1.4266891479492188MB)

   free     = 2567240 (2.4483108520507812MB)

   36.81778446320565% used

From Space:-------------------------------------------------------------------年輕代(倖存者樂園1

   capacity = 458752 (0.4375MB)

   used     = 14208 (0.0135498046875MB)

   free     = 444544 (0.4239501953125MB)

   3.0970982142857144% used

To Space:-----------------------------------------------------------------------------年輕代(倖存者樂園2

   capacity = 458752 (0.4375MB)

   used     = 0 (0.0MB)

   free     = 458752 (0.4375MB)

   0.0% used

concurrent mark-sweep generation:-------------------------------------------------老年代

capacity = 8589934592 (8192.0MB)

used = 0 (0.0MB)

free = 8589934592 (8192.0MB)

0.0% used

Perm Generation:----------------------------------------------------------------------永久代

   capacity = 11796480 (11.25MB)

   used     = 11712040 (11.169471740722656MB)

   free     = 84440 (0.08052825927734375MB)

   99.28419325086806% used

以上的輸出很簡單,第四行起開始輸出此程序我們的JAVA使用的環境。

Heap Configuration,指在我們啟動時設定的一些JVM引數。像最大使用記憶體大小,年老代,年青代,持久代大小等。有這個可以很簡單的檢視本程序的記憶體使用情況。也許程序佔用的總記憶體比較多,但我們在這裡可以看到真正用到的並沒有多少,很多都是"Free"。記憶體使用的堆積大多在老年代,記憶體池露始於此,所以要格外關心“tenured generation”。

-heap:format=b:產生一個HeapDump檔案,此為生成heapdump檔案的重要引數。

例:jmap -heap:format=b 2657

會產生一個heap.bin的heapdump檔案。

需要注意的是,此生成heapdump的引數為JDK1.5,在1.6中的格式為:

jmap -dump:live,format=b,file=xxx 2657

這裡更加強大一些,可以指定是存活的物件,還有生成heapdump的檔名。