Docker下使用jstat查看jvm的GC信息

Jstat指令:

    jstat命令命令格式:

    jstat [Options]vmid [interval] [count]java

    參數說明:

        Options,選項,咱們通常使用 -gcutil 查看gc狀況docker

        vmid,VM的進程號,即當前運行的java進程號bash

        interval,間隔時間,單位爲秒或者毫秒spa

        count,打印次數,若是缺省則打印無數次對象

經常使用指令

    1. jstat -gc pidblog

           能夠顯示gc的信息,查看gc的次數,及時間。進程

           其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。內存

     2.jstat -gccapacity pidci

           能夠顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小,it

           如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,

           PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。

           其餘的能夠根據這個類推, OC是old內純的佔用量。

    3.jstat -gcutil pid

           統計gc信息統計。

    4.jstat -gcnew pid

          年輕代對象的信息。

    5.jstat -gcnewcapacity pid

          年輕代對象的信息及其佔用量。

    6.jstat -gcold pid

         old代對象的信息。

    7.stat -gcoldcapacity pid

         old代對象的信息及其佔用量。

    8.jstat -gcpermcapacity pid

         perm對象的信息及其佔用量。

    9.jstat -class pid

         顯示加載class的數量,及所佔空間等信息。

    10.jstat -compiler pid

         顯示VM實時編譯的數量等信息。

    11.stat -printcompilation pid

         當前VM執行的信息。

 

jstat -gccause pid 1 每格1毫秒輸出結果

jstat -gccause pid 3000 每格3秒輸出結果

圖中參數含義以下:

   S0  — Heap上的 Survivorspace 0 區已使用空間的百分比    

   S1  — Heap上的 Survivorspace 1 區已使用空間的百分比    

   E   — Heap上的 Eden space區已使用空間的百分比    

   O   — Heap上的 Old space 區已使用空間的百分比    

   P   — Perm space 區已使用空間的百分比

   YGC  — 從應用程序啓動到採樣時發生 YoungGC 的次數

   YGCT –從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)    

   FGC  — 從應用程序啓動到採樣時發生 Full GC的次數

   FGCT –從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)    

   GCT  — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)

 

分代垃圾回收詳述

如上圖所示,爲Java堆中的各代分佈。

 

Young(年輕代)

年輕代分三個區。一個Eden區,兩個 Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當這個 Survivor區滿時,此區的存活對象將被複制到另一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。須要注意,Survivor的兩個區是對稱的,沒前後關係,因此同一個區中可能同時存在從Eden複製過來對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor去過來的對象。並且,Survivor區總有一個是空的。

Tenured(年老代)

年老代存放從年輕代存活的對象。通常來講年老代存放的都是生命期較長的對象。

Perm(持久代)

用 於存放靜態文件,現在Java類、方法等。持久代對垃圾回收沒有顯著影響,可是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候須要設置一個比較大的持久代空間來存放這些運行過程當中新增的類。持久代大小經過-XX:MaxPermSize=進行設置。

 

GC類型

GC有兩種類型:Scavenge GCFull GC

Scavenge GC

通常狀況下,當新對象生成,而且在Eden申請空間失敗時,就好觸發ScavengeGC,堆Eden區域進行GC,清除非存活對象,而且把尚且存活的對象移動到Survivor區。而後整理Survivor的兩個區。

Full GC

對整個堆進行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,所以應該儘量減小FullGC。有以下緣由可能致使Full GC:

Tenured被寫滿

Perm域被寫滿

System.gc()被顯示調用

上一次GC以後Heap的各域分配策略動態變化GC類型

 

Docker容器中使用jstat過程:

1.     列出docker容器:docker ps

2.     標準輸入和關聯終端:docker exec -it 容器ID  bash

3.     查找出java進程: ps – ef | grep java

4.     統計gc信息統計: jstat –gcutil 466 3000 每三秒打印一次

相關文章
相關標籤/搜索