參數(shù)
啟動相關
-client
client模式,啟動速度比較快片部,但運行時性能和內存管理效率不高(客戶端或測試)
-server
server模式,啟動速度比較慢,但運行時性能和內存管理效率很高(生產(chǎn)财骨,默認)
-classpath
加載jar包路徑
內存相關
-Xms
堆最小內存,jvm初始化時申請
-Xmx
堆最大內存藏姐,超出報OOM
-Xmn
新生代內存隆箩,包括Eden區(qū)(80%)和兩塊Survior區(qū)(20%)
-XX:NewRatio
新生代與老年代內存占比(減去持久代)
-XX:SurvivorRatio
兩塊Survior區(qū)與Eden區(qū)比例,默認8羔杨,即2:8
-Xss
每個線程堆棧大小
-XX:PermSize
持久代內存
-XX:MaxPermSize
最大持久代內存
GC相關
+表示true捌臊,-表示false
Serial
-XX:+UseSerialGC
年輕代:Serial,老年代:Serial Old
-XX:+UseParNewGC
年輕代:ParNew兜材,老年代:Serial Old
CMS
-XX:+UseConcMarkSweepGC
年輕代:ParNew理澎,老年代:CMS
-XX:-CMSPrecleaningEnabled
不進行 preclean
-XX:CMSInitiatingOccupancyFraction
內存占用率達到多少啟用GC
-XX:+UseCMSCompactAtFullCollection
開啟FullGC后進行內存壓縮
-XX:CMSFullGCsBeforeCompaction
多少次FullGC后進行內存壓縮
-XX:+CMSClassUnloadingEnabled
允許對持久代中不再使用的class元數(shù)據(jù)進行回收
Parallel
-XX:+UseParallelGC
年輕代:Parallel Scavenge,老年代:Serial Old
-XX:+UseParallelOldGC
年輕代:Parallel Scavenge曙寡,老年代:Parallel Old
G1
-XX:+UseG1GC
年輕代:G1糠爬,老年代:G1
通用
-XX:ParallelGCThreads
并行線程數(shù),建議與核心數(shù)一致
-XX:MaxGCPauseMillis
最大GC停頓時間
垃圾收集器
圖1中的 ParallelScavenge举庶、Parallel Old 收集器代表的就是 throughput 收集器执隧,現(xiàn)在主流的配置一般是:
- ParNew + CMS + Serial Old( 備用 )
- ParallelScavenge + Parallel Old( jdk6 )
- G1( jdk7 update 4 及以上)
- ZGC( jdk11 試驗階段)
新生代的GC算法一般都采用標記-復制算法,老年代一般核心算法都是標記-壓縮算法
!!! jdk11 推出了ZGC收集器,現(xiàn)在看介紹牛逼得一批镀琉,后續(xù)補充說明
serial 收集器(串行)
單線程峦嗤,簡單,適合于單CPU屋摔、客戶端級別寻仗,吞吐量小,GC時會stw凡壤,但是在單核機子或年輕代內存只有幾十上百M的桌面應用上署尤,因為少去了線程切換的開銷,反而效率更高
ParNew 收集器(并行)
多線程模式的 serial 收集器亚侠,在多核情況下要比 serial 性能高曹体,但在單核,甚至是雙核某些情況下硝烂,還不如 serial 收集器箕别。
CMS 收集器(并發(fā),響應時間)
多線程滞谢,并發(fā)標記-清除+壓縮串稀,可以設置FullGC的觸發(fā)內存占比,可以按需要開啟多少次GC后進行內存壓縮狮杨,壓縮會增加暫停時間母截。適合響應時間要求高的場合,缺點是比較耗CPU橄教,且由于是并發(fā)清寇,會消耗部分堆內存,若內存在清理未完成時被占滿护蝶,則無法進行GC华烟,一般需要設置備用串行收集器 Serial Old
throughput 收集器(并行,吞吐量)
多線程持灰,適合于吞吐量要求較高的場合盔夜,比較適合中等和大規(guī)模的應用程序,不適合響應時間要求高的程序堤魁,保證最長時延下的最大吞吐量
G1 收集器(并發(fā)喂链,吞吐量,響應時間)
G1收集器是一種服務器式垃圾收集器姨涡,適用于具有大內存容量的多處理器機器衩藤。采用堆內存分區(qū)(region)的方式,同時在執(zhí)行全堆操作(如全局標記)時涛漂,應用程序線程也同步執(zhí)行赏表,防止因為堆內對象過多導致stw检诗,實現(xiàn)高吞吐量以及保證低時延
jvm檢測工具(具體說明待補全)
jstack
jstat
jmap
jconsole
mat
arthas
總結
- 一般來說,最大與初始內存設置成一樣瓢剿,可以避免 jvm 頻繁申請內存逢慌,如-Xms和-Xmx,-XX:PermSize和-XX:MaxPermSize间狂;
- 高吞吐量和低暫停時間是矛盾關系攻泼,需要根據(jù)具體業(yè)務進行設置,因為高吞吐量意味著盡可能不進行GC鉴象,GC時堆內對象過多忙菠,stw時間長,而低暫停時間則需要更為頻繁的GC纺弊,這樣一直保持著短時間的stw時間牛欢。當然現(xiàn)在的G1還有ZGC都避免了全堆掃描,使得其保證高吞吐量的同時也能最大限度兼顧更低的暫停時間
- 具體的垃圾收集器選擇不僅僅要考慮使用場景淆游,還需要考慮機器本身的性能傍睹,若內存容量低,對時延要求又不是那么高犹菱,選擇并行收集器比CMS拾稳、G1都要好,因為并發(fā)收集器本身是要占堆內存的腊脱。若為單核機器访得,則要選擇串行垃圾收集器
參考文獻
- Oracle.Garbage-First Collector[EB/OL].https://.docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html,1993-2018
- Oracle.JDK 11 Release Notes[EB/OL].https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#NewFeature,1993-2018
- 梁鐘霖.JVM Throughput和CMS垃圾回收器[EB/OL].https://www.liangzl.com/get-article-detail-13400.html,2018-08-17