java 命令簡單查看jvm內存使用狀況
jinfo:可以輸出並修改運行時的java 進程的opts。
jps:與unix上的ps類似,用來顯示本地的java進程,可以查看本地運行着幾個java程序,並顯示他們的進程號。
jstat:一個極強的監視VM內存工具。可以用來監視VM內存內的各種堆和非堆的大小及其內存使用量。
jmap:打印出某個java進程(使用pid)內存內的所有'對象'的情況(如:產生那些對象,及其數量)。
1、jinfo
jinfo:的用處比較簡單,就是能輸出並修改運行時的java進程的運行參數。用法是jinfo -opt pid 如:查看52606的MaxPerm大小可以用 jinfo -flag MaxPermSize 52606。
2、jps
顯示當前所有java進程pid的命令,我們可以通過這個命令來查看到底啟動了幾個java進程(因為每一個java程序都會獨占一個java虛擬機實例),不過jps有個缺點是只能顯示當前用戶的進程id,要顯示其他用戶的還只能用linux的ps命令。
執行jps命令,會列出所有正在運行的java進程,其中jps命令也是一個java程序,前面的數字就是對應的進程id,這個id的作用非常大,后面會有相關介紹。
jps -help:
jps -l :
輸出應用程序main.class的完整package名或者應用程序jar文件完整路徑名
jps -v: 輸出傳遞給JVM的參數
jps失效
我們在定位問題過程會遇到這樣一種情況,用jps查看不到進程id,用ps -ef | grep java卻能看到啟動的java進程。
要解釋這種現象,先來了解下jps的實現機制:
java程序啟動后,會在目錄/tmp/hsperfdata_{userName}/下生成幾個文件,文件名就是java進程的pid,因此jps列出進程id就是把這個目錄下的文件名列一下而已,至於系統參數,則是讀取文件中的內容。
我們來思考下:如果由於磁盤滿了,無法創建這些文件,或者用戶對這些文件沒有讀的權限。又或者因為某種原因這些文件或者目錄被清除,出現以上這些情況,就會導致jps命令失效。
如果jps命令失效,而我們又要獲取pid,還可以使用以下兩種方法:
1、top | grep java
2、ps -ef |grep java
3、jstat
jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。
jstat -class pid:顯示加載class的數量,及所占空間等信息。
jstat -compiler pid:顯示VM實時編譯的數量等信息。
jstat -gc pid:可以顯示gc的信息,查看gc的次數,及時間。其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。
jstat -gcnew pid:new對象的信息。
jstat -gcnewcapacity pid:new對象的信息及其占用量。
jstat -gcold pid:old對象的信息。
jstat -gcoldcapacity pid:old對象的信息及其占用量。
jstat -gcpermcapacity pid: perm對象的信息及其占用量。
jstat -util pid:統計gc信息統計。
jstat -printcompilation pid:當前VM執行的信息。
除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 260 6是每260毫秒打印一次,一共打印6次,還可以加上-h3每三行顯示一下標題。
4、jmap
主要用於打印指定java進程的共享對象內存映射或堆內存細節。
堆Dump是反映堆使用情況的內存鏡像,其中主要包括系統信息、虛擬機屬性、完整的線程Dump、所有類和對象的狀態等。一般在內存不足,GC異常等情況下,我們會去懷疑內存泄漏,這個時候就會去打印堆Dump。
jmap的用法:
jmap pid
打印的信息分別為:共享對象的起始地址、映射大小、共享對象路徑的全程。
jmap -heap pid:查看堆使用情況
map -histo pid:查看堆中對象數量和大小
打印的信息分別是:序列號、Class實例的數量、內存的占用、類限定名
如果是內部類,類名的開頭會加上*,如果加上live子參數的話,如jmap -histo:live pid,這個命名會觸發一次FUll GC,只統計存活對象