1. 程式人生 > >jstat命令

jstat命令

垃圾回收 容量 yun -i 釋放 href 應用程序 我們 效果

概述


Jstat 查看某個Java進程內的線程堆棧信息,用於監控基於HotSpot的JVM,對其堆的使用情況進行實時的命令行的統計,使用jstat我們可以對指定的JVM做如下監控:

- 類的加載及卸載情況

- 查看新生代、老生代及持久代的容量及使用情況

- 查看新生代、老生代及持久代的垃圾收集情況,包括垃圾回收的次數及垃圾回收所占用的時間

- 查看新生代中Eden區及Survior區中容量及分配情況等


常用命令及輸出分析

1、總結垃圾回收統計

$ jstat -gcutil 19148 1000 10

每1秒一次顯示進程號為 19148的 java進成的 GC情況(只打印10次),結果如下圖:

技術分享圖片

如何判斷應用程序是否有內存的問題:

1. Full GC的頻率,時長和效果: 如果Full GC頻率較高,比如數秒一次,那麽此時程序可能就已經出問題了,因為jvm在Full GC的時候是不響應外部請求的。

如果Full GC時間較長,比如持續數秒,那麽此時程序可能就已經出問題了,因為jvm在Full GC的時候是不響應外部請求的。

如果Full GC之後old 區內存沒有顯著減少,那麽程序很可能有內存泄露問題,並且不久將來可能出現outofmemory異常。

如果young gc和full gc能夠正常發生,且都能有效回收內存,常駐內存區變化不明顯,則說明java內存釋放情況正常,垃圾回收及時,java內存泄露的幾率就會大大降低。但也不能說明一定沒有內存泄露。

2. GC的頻率,時長和效果: 如果JVM進行內存回收的頻率非常高,比如幾乎每數秒中就有一次,每次回收的時間為數秒鐘;並且,通過輸出還發現每次回收釋放的內存非常有限,大多數對象都無法回收。這種現象很大程度上暗示著內存泄漏。(此時可以用“jmap”來獲得當前的一個內存映象,看看哪些對象導致這個問題來找出原因)

如果每次GC時間特別長,比如說數十秒,那這種現象很大程度上暗示著內存泄漏。(內存中對象太多,導致遍歷時間太長,有時候不好的緩存機制會造成這樣的問題)

完整語法詳解

技術分享圖片

官方詳細文檔

jstat [Options] vmid [interval] [count]

命令參數說明:

Options,一般使用 -gcutil 或 -gc 查看gc 情況

pid,當前運行的 java進程號

interval,間隔時間,單位為秒或者毫秒

count,打印次數,如果缺省則打印無數次

PS:不同的操作系統支持的選項可能會不一樣,可以通過-options選項,查看不同操作系統所支持選項。(下圖為公司服務器所支持的選項)

Option

Displays...

class

用於查看類加載情況的統計

compiler

用於查看HotSpot中即時編譯器編譯情況的統計

gc

用於查看JVM中堆的垃圾收集情況的統計

gccapacity

用於查看新生代、老生代及持久代的存儲容量情況

gccause

用於查看垃圾收集的統計情況(這個和-gcutil選項一樣),如果有發生垃圾收集,它還會顯示最後一次及當前正在發生垃圾收集的原因。

gcnew

用於查看新生代垃圾收集的情況

gcnewcapacity

用於查看新生代的存儲容量情況

gcold

用於查看老生代及持久代發生GC的情況

gcoldcapacity

用於查看老生代的容量

gcpermcapacity

用於查看持久代的容量

gcutil

用於查看新生代、老生代及持代垃圾收集的情況

printcompilation

HotSpot編譯方法的統計

jstat命令