这 17 个 JVM 参数,高级 Java 必须掌握!
作者:SimpleSmile
cnblogs.com/Simple-Object/p/10272326.html
前言
大家都知道,jvm在啟動的時候,會執行默認的一些參數。一般情況下,這些設置的默認參數應對一些平常的項目也夠用了。但是如果項目特別大了,需要增加一下堆內存的大小、或者是系統老是莫明的掛掉,想查看下gc日志來排查一下錯誤的原因,都需要咱們手動設置這些參數。
各個參數介紹
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??[B2:????????890643???????21375432??java.util.HashMap$Node3:????????890608???????14249728??java.lang.Long4:????????????13????????8389712??[Ljava.util.HashMap$Node;5:??????????2062?????????371680??[C6:???????????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的大小。
總結
以上就是我整理的一些jvm設置的參數,當然不止這些。我這只是介紹了些常用的參數。希望能夠幫到大家,由于能力有限,如有錯誤的地方敬請諒解。
總結
以上是生活随笔為你收集整理的这 17 个 JVM 参数,高级 Java 必须掌握!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结合代码详细聊聊 Java 网络编程中的
- 下一篇: Redis常用操作和内存模型