1. 程式人生 > >gc狀態查詢(java)

gc狀態查詢(java)

Jstat是JDK自帶的一個輕量級小工具。全稱“Java Virtual Machine statistics monitoring tool”,它位於java的bin目錄下,主要利用JVM內建的指令對Java應用程式的資源和效能進行實時的命令列的監控,包括了對Heap size和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常適用。

jstat工具特別強大,有眾多的可選項,詳細檢視堆內各個部分的使用量,以及載入類的數量。使用時,需加上檢視程序的程序id,和所選引數。

執行:cd $JAVA_HOME/bin中執行jstat,注意jstat後一定要跟引數。

語法結構:
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

引數解釋:
Options — 選項,我們一般使用 -gcutil 檢視gc情況
vmid    — VM的程序號,即當前執行的java程序號
interval– 間隔時間,單位為秒或者毫秒
count   — 列印次數,如果預設則列印無數次
stat -printcompilation pid:當前VM執行的資訊。

-gcutil引數
S0  — Heap上的 Survivor space 0 區已使用空間的百分比
S1  — Heap上的 Survivor space 1 區已使用空間的百分比
E   — Heap上的 Eden space 區已使用空間的百分比
O   — Heap上的 Old space 區已使用空間的百分比
P   — Perm space 區已使用空間的百分比
YGC — 從應用程式啟動到取樣時發生 Young GC 的次數
YGCT– 從應用程式啟動到取樣時 Young GC 所用的時間(單位秒)
FGC — 從應用程式啟動到取樣時發生 Full GC 的次數
FGCT– 從應用程式啟動到取樣時 Full GC 所用的時間(單位秒)
GCT — 從應用程式啟動到取樣時用於垃圾回收的總時間(單位秒)

jstat使用過程如下:
sudo jps
用來顯示本地的java程序,可以檢視本地執行著幾個java程式,並顯示他們的程序號。   

1,使用top命令檢視java的pid,發現有2個java程序,不確定哪個對應的是web應用的程序號
Html程式碼  收藏程式碼
  1. [email protected]:~$ top  
  2. top - 11:34:00 up 112 days, 10:48,  2 users,  load average: 0.77, 0.36, 0.26  
  3. Tasks: 247 total,   1 running, 246 sleeping,   0 stopped,   0 zombie  
  4. Cpu(s): 15.8%us,  1.5%sy,  0.0%ni, 82.5%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st  
  5. Mem:  12321892k total,  2440448k used,  9881444k free,   515004k buffers  
  6. Swap: 31249400k total,      112k used, 31249288k free,   995320k cached  
  7.   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
  8. 16183 root      20   0 1564m 175m  12m S  126  1.5   0:03.82 java  
  9. 15581 root      20   0  305m  54m 9988 S    1  0.5   0:05.13 java  
  10. 15689 www-data  20   0 55084  28m  956 S    1  0.2   0:01.51 nginx  
  11. 15688 www-data  20   0 55332  28m  956 S    0  0.2   0:04.63 nginx  
  12. 16182 webserver       20   0 19356 1528 1064 R    0  0.0   0:00.02 top  
  13.     1 root      20   0 23704 1932 1296 S    0  0.0   0:02.24 init  
  14.     2 root      20   0     0    0    0 S    0  0.0   0:00.01 kthreadd  
  15.     3 root      RT   0     0    0    0 S    0  0.0   0:00.02 migration/0  


2,使用ps -ef | grep java,可以看到java應用程式對應的程序號ps -ef | grep tomcat 看到的東西更加少,好找些
Html程式碼  收藏程式碼
  1. [email protected]:/usr/local/resin$ ps -ef | grep java  
  2. root     17778     1  0 13:10 pts/0    00:00:16 /usr/lib/jvm/java-6-sun-1.6.0.20/bin/java -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true-Dresin.home=/usr/local/resin -Dresin.root=/usr/local/resin/ -Xrs -Xss256k -Xmx32m -Dcom.sun.management.jmxremote -d64 com.caucho.boot.WatchdogManager -resin-home /usr/local/resin -conf /usr/local/resin/conf/resin-8080.conf start  
  3. root     18293 17778  8 13:56 pts/0    00:07:14 /usr/lib/jvm/java-6-sun-1.6.0.20/bin/java -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djava.system.class.loader=com.caucho.loader.SystemClassLoader -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true-Dresin.home=/usr/local/resin [color=red]-Xmx4096m -Xms4096m -Xmn1024m -Xss1m -Xdebug -Dcom.sun.management.jmxremote -XX:PermSize=512M-XX:MaxPermSize=1024M[/color] -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true-Dresin.home=/usr/local/resin -Dresin.root=/usr/local/resin/ -Dcom.sun.management.jmxremote -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djav .awt.headless=true-Dresin.home=/usr/local/resin -Dresin.root=/usr/local/resin/ -Dcom.sun.management.jmxremote com.caucho.server.resin.Resin --root-directory /usr/local/resin -conf /usr/local/resin/conf/resin-8080.conf -socketwait 29006 -resin-home /usr/local/resin start  
  4. webserver      18867 14532  0 15:21 pts/0    00:00:00 grep --color=auto java  


3,執行sudo jstat -gcutil 程序號 5s(每隔5秒檢視jvm垃圾回收情況)
Html程式碼  收藏程式碼
  1. [email protected]:~$ sudo jstat -gcutil 16183 5s  
  2.   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
  3.   5.02   0.00  49.75  30.01  65.49     14    0.421     1    0.121    0.542  
  4.   5.02   0.00  88.80  30.01  65.62     14    0.421     1    0.121    0.542  
  5.   0.00  96.66  32.79  30.44  65.81     15    0.428     1    0.121    0.549  
  6.   0.00  96.66  72.60  30.44  65.93     15    0.428     1    0.121    0.549  
  7.   1.20   0.00  38.76  30.61  66.01     16    0.439     1    0.121    0.560  
  8.   1.20   0.00  63.20  30.61  66.08     16    0.439     1    0.121    0.560  
  9.   0.00   1.28  30.78  30.71  66.45     17    0.446     1    0.121    0.567  
  10.   0.00   1.28  67.98  30.71  66.57     17    0.446     1    0.121    0.567  
  11.   1.65   0.00   8.04  30.81  66.67     18    0.452     1    0.121    0.573  
  12.   1.65   0.00  47.42  30.81  66.82     18    0.452     1    0.121    0.573  
  13.   1.65   0.00  90.38  30.81  66.91     18    0.452     1    0.121    0.573  
  14.   0.00   1.41  37.02  30.94  66.97     19    0.458     1    0.121    0.578  
  15.   0.00   1.41  75.75  30.94  66.98     19    0.458     1    0.121    0.578  
  16.   1.19   0.00  18.04  31.04  67.13     20    0.465     1    0.121    0.585  


其他可用option:

可以通過命令:jstat -options option,看到支援的option引數
-class (類載入器)
-compiler (JIT)
-gc (GC堆狀態)
-gccapacity (各區大小)
-gccause (最近一次GC統計和原因)
-gcnew (新區統計)
-gcnewcapacity (新區大小)
-gcold (老區統計)
-gcoldcapacity (老區大小)
-gcpermcapacity (永久區大小)
-gcutil (GC統計彙總)
-printcompilation (HotSpot編譯統計)

jstat -gcutil pid: 統計gc資訊統計。
jstat -gccapacity pid: 可以顯示,VM記憶體中三代(young,old,perm)物件的使用和佔用大小

-gccapacity引數:
NGCMN:年輕代(young)中初始化(最小)的大小 (位元組)
NGCMX:年輕代(young)的最大容量 (位元組)
NGC:年輕代(young)中當前的容量 (位元組)
S0C:年輕代中第一個survivor(倖存區)的容量 (位元組)
S1C:年輕代中第二個survivor(倖存區)的容量 (位元組)
EC:年輕代中Eden(伊甸園)的容量 (位元組)
OGCMN:old代中初始化(最小)的大小 (位元組)
OGCMX:old代的最大容量 (位元組)
OGC:old代當前新生成的容量 (位元組)
OC:Old代的容量 (位元組)
PGCMN:perm代中初始化(最小)的大小 (位元組)
PGCMX:perm代的最大容量 (位元組)
PGC:perm代當前新生成的容量 (位元組)
PC:Perm(持久代)的容量 (位元組)
YGC:從應用程式啟動到取樣時年輕代中gc次數
FGC:從應用程式啟動到取樣時old代(全gc)gc次數

jps -mlVv localhost
jps [ options ] [ hostid ]
其中,options可以用:
-q (安靜)
-m (輸出傳遞給main方法的引數)
-l (顯示完整路徑)
-v (顯示傳遞給JVM的命令列引數)
-V (顯示通過flag檔案傳遞給JVM的引數)
-J (和其他Java工具類似用於傳遞引數給命令本身要呼叫的java程序);
hostid是主機id,預設localhost。

Jstack Usage:
    jstack [-l] <pid>
        (to connect to running process 連線到正在執行的程序)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process 連線到懸掛的程序)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file 連線到core檔案)
    jstack [-m] [-l] [[email protected]]<remote server IP or hostname>
        (to connect to a remote debug server 連線到遠端機器)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

jstack 3713;
jstack -F 3713
jstack -l -m  /opt/jdk1.6.0/bin/java core.659
可以觀察到jvm中當前所有執行緒的執行情況和執行緒當前狀態
Java程式碼  收藏程式碼
  1. Attaching to process ID 3713, please wait...  
  2. Debugger attached successfully.  
  3. Server compiler detected.  
  4. JVM version is 20.4-b02  
  5. Deadlock Detection:  
  6. No deadlocks found.  
  7. Thread 12172: (state = BLOCKED)  
  8.  - sun.misc.Unsafe.park(booleanlong@bci=0 (Interpreted frame)  


jmap:顯示java程序記憶體使用的相關資訊
    jmap pid #列印記憶體使用的摘要資訊
    jmap –heap pid #java heap資訊
    jmap -histo:live pid #統計物件count ,live表示在使用
    jmap -histo pid >mem.txt #列印比較簡單的各個有多少個物件佔了多少記憶體的資訊,一般重定向的檔案
    jmap -dump:format=b,file=mem.dat pid #將記憶體使用的詳細情況輸出到mem.dat 檔案

jvm配置列印GC相關資訊
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
對應的日誌會輸出到catalina的日誌中去

jinfo -flag HeapDumpBeforeFullGC  29167  #檢視HeapDumpBeforeFullGC 
jinfo: 檢視和修改JVM引數
Usage:
    jinfo <option> <pid>
       (to connect to a running process)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -h | -help           to print this help message

相關推薦

gc狀態查詢java

Jstat是JDK自帶的一個輕量級小工具。全稱“Java Virtual Machine statistics monitoring tool”,它位於java的bin目錄下,主要利用JVM內建的指令對Java應用程式的資源和效能進行實時的命令列的監控,包括了對Heap s

折半查詢Java

/*折半查詢 比方說,對於從小到大升序的陣列,只要判斷資料是否和陣列中間值相等, 如果不相等,當該資料小於陣列中間元素的值,則說明資料在中間值的左側, 因此將這組資料的區間縮小為中間值左側的區間,以此類推。直到查詢區間縮小為0還沒找到,說明要查詢的資料不在陣列中。 */ i

Binary search 二分查詢java

二分查詢 二分查詢可能是最常見的筆試考題之一 package binarySearchDemo; import java.util.Scanner; public class binary_search {     public static void

劍指offer——二維陣列中的查詢JAVA

題目描述 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 解題思路 利用二維陣列

在SPRING DATA MONGODB中使用聚合統計查詢Java

public class VideoRepositoryImpl implements VideoRepositoryCustom{          private static Logger logger = LoggerFactory.getLogger(VideoRepositoryImpl.cla

二維陣列中的查詢Java

題目:在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。第一思路:在二維陣列中選取一個數字,分3種情況來查詢的過程。(1)選取的數字和target相等,則查詢過

javaleetcode852 山脈陣列的封頂索引二分查詢法找出陣列中最大值的下標Peak Index in a Mountain Array

題目描述: 我們把符合下列屬性的陣列 A 稱作山脈: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A

二分查詢的兩種實現Java

查詢過程 首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功

演算法——把二元查詢樹轉變成排序的雙向連結串列JAVA

輸入一棵二元查詢樹,將該二元查詢樹轉換成一個排序的雙向連結串列。 要求不能建立任何新的結點,只調整指標的指向。 轉換成雙向連結串列 1=2=3=4=5=6=7=8=9=10=11=12=13=14=15。 程式碼如下 public class B

二分查詢Java實現

二分查詢又稱為折半查詢,要求線性表必須採用順序儲存結構,並且元素按關鍵字有序排列。 查詢過程:假設陣列中元素按升序排列,將陣列中間位置的值與待查值比較,如果相等則查詢成功;否則利用中間位置下標將陣列分成

無序連結串列實現順序查詢Java實現

連結串列中的每個結點儲存一個鍵值對,get()的實現即為遍歷連結串列,equals()方法比較需要被查詢的鍵和每個結點中的鍵,如果匹配成功就返回相應的值,否則返回null。put()的實現也是遍歷連結串

JVM GC調優2-----GC演算法判定物件可以被回收部分摘自深入理解Java虛擬機器

這次我們介紹JVM中的GC演算法 引用計數法 可達性分析法 首先我們提出四個問題 哪裡的記憶體需要回收? 什麼時候回收? 如何回收? Java與C++之間有一堵由記憶體動態分配和垃圾收集技術所圍成的“高牆”, 牆外面的人想進去, 牆裡面的人卻想出來。

JVM GC調優3-----GC演算法部分摘自深入理解Java虛擬機器

介紹幾種GC演算法的思想及其發展過程: 標記-清除 複製 標記-壓縮 分代收集演算法 GC演算法主要是用於堆死亡物件的清理的集中方式,他們各有優缺點,下面我們開始做介紹 標記清除演算法 原理解析 -最基礎的收集演算法是“標記-清除”( Mark-Swe

一行程式碼搞定二分查詢java

效果如圖: public static int rank(double key,double[] a,int lo,int hi){ return lo>hi?-1:key<a[lo+(hi-lo)/2]?rank(key,a,lo,lo+(hi-lo)/2-

leetcode 29 ---- 二分查詢(中等) : 兩數相除java

1.  問題:給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。 示例 1: 輸入: dividend = 10, divisor = 3

牛客網——華為機試題14:字串的連線最長路徑查詢Java

題目描述: 給定n個字串,請對n個字串按照字典序排列。 輸入描述: 輸入第一行為一個正整數n(1≤n≤1000),下面n行為n個字串(字串長度≤100),字串中只含有大小寫字母。 輸出描述: 資料輸出n行,輸出結果為按照字典序排列的字串。 示例1: 輸入: 9

簡單的折半查詢演算法Java

折半查詢的優點是能夠最大減少查詢的時間複雜度,但也對查詢的目標陣列或集合提出一定要求,即陣列或集合中的數字排序必須是有序的,否則不能用折半查詢,只能用遍歷。以下是簡單的折半查詢演算法: public class test { public static void main

劍指offer之二維陣列中的查詢Java實現

2. 二維陣列中的查詢 題目描述 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

自己寫UDF函式匯入hive對查詢結果進行格式化顯示Java

本篇UDF函式使用IntelliJ IDEA進行編寫和打包,使用的是Java語言,資料使用上一篇部落格“HDFS、Hive(Impala)讀取本地檔案到HDFS,再使用Hive(Impala)從HDFS讀取檔案進行建表”中已經放入hive中的資料進行查詢展示。 建立一個ma

藍橋杯java:數列特徵,查詢整數,楊輝三角,特殊的數字,迴文數

人生無趣,生活不易,一起找點樂子吧。     數列特徵: 問題描述 給出n個數,找出這n個數的最大值,最小值,和。 輸入格式 第一行為整數n,表示數的個數。 第二行有n個數,為給定的n個數,每個數的絕對值都小於10000。 輸出格式 輸出三行,每行一個整