天天看點

作為進階開發工程師,你懂 JVM 參數嗎?

大家都知道,jvm在啟動的時候,會執行預設的一些參數。一般情況下,這些設定的預設參數應對一些平常的項目也夠用了。但是如果項目特别大了,需要增加一下堆記憶體的大小、或者是系統老是莫明的挂掉,想檢視下gc日志來排查一下錯誤的原因,都需要咱們手動設定這些參數。

目錄

  • ​​1.verbose:gc​​
  • ​​2.-XX:+printGC​​
  • ​​3.-XX:+PrintGCDetails​​
  • ​​4.-XX:+PrintGCTimeStamps​​
  • ​​5.-X:loggc:log/gc.log​​
  • ​​6.-XX:+PrintHeapAtGC​​
  • ​​7.-XX:+TraceClassLoading​​
  • ​​8.-XX:+PrintClassHistogram​​
  • ​​9.-Xmx -Xms​​
  • ​​10.-Xmn​​
  • ​​11.-XX:NewRatio​​
  • ​​12.-XX:SurvivorRatio​​
  • ​​13.-XX:+HeapDumpOnOutMemoryError​​
  • ​​14.-XX:+HeapDumpPath​​
  • ​​15.-XX:OnOutOfMemoryError​​
  • ​​16.-XX:PermSize -XX:MaxPermSize​​
  • ​​17.-Xss​​
  • ​​總結​​

各個參數介紹

1.verbose:gc

表示,啟動jvm的時候,輸出jvm裡面的gc資訊。格式如下:

[Full GC 178K->99K(1984K), 0.0253877 secs]      

解讀 :Full GC 就表示執行了一次Full GC的操作,178K 和99K 就表示執行GC前記憶體容量和執行GC後的記憶體容量。1984K就表示記憶體總容量。後面那個是執行本次GC所消耗的時間,機關是秒。

2.-XX:+printGC

這個列印的GC資訊跟上個一樣,就不做介紹了。

3.-XX:+PrintGCDetails

列印GC的詳細資訊。格式如下:

–Heap
– def new generation   total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000)
–  eden space 12288K,  91% used [0x27e80000, 0x28975f20, 0x28a80000)
–  from space 1536K,   0% used [0x28a80000, 0x28a80000, 0x28c00000)
–  to   space 1536K,   0% used [0x28c00000, 0x28c00000, 0x28d80000)
– tenured generation   total 5120K, used 0K [0x28d80000, 0x29280000, 0x34680000)
–   the space 5120K,   0% used [0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
– compacting perm gen  total 12288K, used 142K [0x34680000, 0x35280000, 0x38680000)
–   the space 12288K,   1% used [0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
–    ro space 10240K,  44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
–    rw space 12288K,  52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)      

解讀:new generation 就是堆記憶體裡面的新生代。total的意思就是一共的,是以後面跟的就是新生代一共的記憶體大小。used也就是使用了多少記憶體大小。0x開頭的那三個分别代表的是 底邊界,目前邊界,高邊界。也就是新生代這片記憶體的起始點,目前使用到的地方和最大的記憶體地點。

eden space 這個通常被翻譯成伊甸園區,是在新生代裡面的,一些建立的對象都會先被放進這裡。後面那個12288K就表示伊甸園區一共的記憶體大小,91% used,很明顯,表示已經使用了百分之多少。後面的那個0x跟上一行的解釋一樣。

from space 和to space 是幸存者的兩個區。也是屬于新生代的。他兩個區的大小必須是一樣的。因為新生代的GC采用的是複制算法,每次隻會用到一個幸存區,當一個幸存區滿了的時候,把還是活的對象複制到另個幸存區,上個直接清空。這樣做就不會産生記憶體碎片了。

tenured generation 就表示老年代。

compacting perm 表示永久代。由于這兩個的格式跟前面我介紹的那個幾乎一樣,我就不必介紹了。

4.-XX:+PrintGCTimeStamps

列印GC發生的時間戳。格式如下:

289.556: [GC [PSYoungGen: 314113K->15937K(300928K)] 405513K->107901K(407680K), 0.0178568 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
  
293.271: [GC [PSYoungGen: 300865K->6577K(310720K)] 392829K->108873K(417472K), 0.0176464 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]      

解讀:289.556表示從jvm啟動到發生垃圾回收所經曆的的時間。GC表示這是新生代GC(Minor GC)。PSYoungGen表示新生代使用的是多線程垃圾回收器Parallel Scavenge。314113K->15937K(300928K)]這個跟上面那個GC格式一樣,隻不過,這個是表示的是新生代,幸存者區。後面那個是整個堆的大小,GC前和GC後的情況。Times這個顯而易見,代表GC的所消耗的時間,使用者垃圾回收的時間和系統消耗的時間和最終真實的消耗時間。

5.-X:loggc:log/gc.log

這個就表示,指定輸出gc.log的檔案位置。(我這裡寫的log/gc.log就表示在目前log的目錄裡,把GC日志寫到叫gc.log的檔案裡。)

6.-XX:+PrintHeapAtGC

表示每次GC後,都列印堆的資訊。(這個列印的基本格式跟上面第二條的基本類似,我也就不比多說了。)

7.-XX:+TraceClassLoading

監控類的加載。格式如下:

•[Loaded java.lang.Object from shared objects file]

•[Loaded java.io.Serializable from shared objects file]

•[Loaded java.lang.Comparable from shared objects file]

•[Loaded java.lang.CharSequence from shared objects file]

•[Loaded java.lang.String from shared objects file]

•[Loaded java.lang.reflect.GenericDeclaration from shared objects file]

•[Loaded java.lang.reflect.Type from shared objects file]

使用這個參數就能很清楚的看到那些類被加載的情況了。

8.-XX:+PrintClassHistogram

跟蹤參數。這個按下Ctrl+Break後,就會列印一下資訊:

num     #instances         #bytes  class name
----------------------------------------------
1:        890617      470266000  [B
2:        890643       21375432  java.util.HashMap$Node
3:        890608       14249728  java.lang.Long
4:            13        8389712  [Ljava.util.HashMap$Node;
5:          2062         371680  [C
6:           463          41904  java.lang.Class      

–分别顯示:序号、執行個體數量、總大小、類型。

這裡面那個類型,B和C的其實就是byte和char類型。

9.-Xmx -Xms

這個就表示設定堆記憶體的最大值和最小值。這個設定了最大值和最小值後,jvm啟動後,并不會直接讓堆記憶體就擴大到指定的最大數值。而是會先開辟指定的最小堆記憶體,如果經過數次GC後,還不能,滿足程式的運作,才會逐漸的擴容堆的大小,但也不是直接擴大到最大記憶體。

10.-Xmn

設定新生代的記憶體大小。

11.-XX:NewRatio

新生代和老年代的比例。比如:1:4,就是新生代占五分之一。

12.-XX:SurvivorRatio

設定兩個Survivor區和eden區的比例。比如:2:8 ,就是一個Survivor區占十分之一。

13.-XX:+HeapDumpOnOutMemoryError

發生OOM時,導出堆的資訊到檔案。

14.-XX:+HeapDumpPath

表示,導出堆資訊的檔案路徑。

15.-XX:OnOutOfMemoryError

當系統産生OOM時,執行一個指定的腳本,這個腳本可以是任意功能的。比如生成目前線程的dump檔案,或者是發送郵件和重新開機系統。

16.-XX:PermSize -XX:MaxPermSize

設定永久區的記憶體大小和最大值。永久區記憶體用光也會導緻OOM的發生。

17.-Xss

設定棧的大小。棧都是每個線程獨有一個,所有一般都是幾百k的大小。

總結