聊聊JVM常用參數設置

整體考慮堆大小

-Xms3550m, 初始化堆大小。通常情況和-Xmx大小設置一樣,避免虛擬機頻繁自動計算後調整堆大小。
-Xmx3550m,最大堆大小。

考慮分代設置堆大小

首先通過jstat等工具查看應用程序正常情況下需要堆大小,再根據實際情況設置。

新生代

-xmn2g,新生代大小。Sun官方推薦配置爲整個堆的3/8。
-XX:SurvivorRatio=8。Eden和Survivor的比值。

老年代

老年代=整個堆大小-新生代-永久代

永久代

-XX:Permsize=512m,設置永久代初始值。
-XX:MaxPermsize=512m,設置永久代的最大值。
注:Java8沒有永久代說法,它們被稱爲元空間,-XX:MetaspaceSize=N

考慮本機直接內存

-XX:MaxDirectMemorySize=100M。默認與Java堆大最大值(-Xmx)

考慮虛擬機棧

每個線程池的堆棧大小。在jdk5以上的版本,每個線程堆棧大小爲1m,jdk5以前的版本是每個線程池大小爲256k。一般設置256k。
-Xss256K.

考慮選擇垃圾收集器

Serial收集器(串行收集器)

歷史最悠久的串行收集器。參數-XX:UseSerialGC。不太常用。

ParNew和ParOld收集器(併發收集器)

Serial的多線程版本收集器。

Parallel Scavenge(吞吐量優先垃圾收集器)

並行收集器,不同於多線程收集器ParNew,關注吞吐量的收集器。
-XX:MaxGCPauseMillis=10,設置垃圾收集停頓的最大毫秒數。
-XX:GCTimeRatio=49,垃圾收集器佔比,默認是99。
-XX:+UseAdaptiveSeizPolicy,GC自適應調節策略。
-XX:+UseParallelGC,虛擬機Server模式默認值,使用Parallel Scavenge + Serial Old進行內存回收。
-XX:+UseParallelOldGC, 使用Parallel Scavenge + Parallel Old 進行內存回收。

CMS

CMS作爲老年代收集器,不能與Parallel Scavenge並存。可能會有內存碎片問題。
-XX:+UserConcMarkSweepGC,新生代默認用ParNew收集。也可以用-XX:+UserParNewGC強制指定新生代用ParNew收集
-XX:ParallelGCThreads=4,設置垃圾收集線程數。默認是(CPU數量+3)/4。垃圾收集線程數不少於25%,當CPU數量小於4的時候影響大。
-XX:CMSInitiatingOccupancyFraction=80,老年代垃圾佔比達到這個閾值開始CMS收集,1.6默認是92。設置過高容易導致併發收集失敗,會出現SerialOld收集的情況。
-XX:+UseCMSCompactAtFullCollection,在FULL GC的時候, 對年老代的壓縮增加這個參數是個好習慣。可能會影響性能,但是可以消除碎片。
-XX:CMSFullGCsBeforeCompaction=1,多少次後進行內存壓縮。
-XX:+CMSParallelRemarkEnabled, 爲了減少第二次暫停的時間,開啓並行remark,降低標記停頓

G1(Garbage First)

-XX:+UseG1GC,謹慎使用,需要經過線上測試,還沒有被設置爲默認垃圾收集器。
之前的垃圾收集器收集的範圍是新生代或者老年代,而G1垃圾收集器收集的範圍包括新生代和老年代整個堆。G1將Java堆劃爲多個大小相同的獨立區域(Region),垃圾收集單位是Region。G1垃圾收集適合至少大於4G內存得系統。並且不會產生內存空間碎片。

其他參數

-XX:MaxTenuringThreshold=30,晉升老年代的年齡。
-XX:PretenureSizeThreshold=?,晉升老年代的對象大小。沒設置過。

考慮日誌打印

-verbose:gc,打印GC日誌
-XX:+PrintGC,打印GC基本日誌
-XX:+PrintGCDetails,打印GC詳細日誌
-XX:+PrintGCTimeStamps,打印相對時間戳
-XX:+PrintGCApplicationStoppedTime,打印垃圾回收期間程序暫停的時間
-XX:+PrintGCApplicationConcurrentTime,打印每次垃圾回收前,程序未中斷的執行時間
-XX:+PrintTenuringDistribution:查看每次minor GC後新的存活週期的閾值
-XX:+PrintTLAB,查看TLAB空間的使用情況
-Xloggc:filename,把相關日誌信息記錄到文件以便分析

考慮OOM(堆溢出)時保留現場日誌

當拋出OOM時進行heapdump

-XX:+HeapDumpOnOutOfMemoryError,JVM異常自動生成堆轉儲
-XX:HeapDumpPath=,堆轉儲文件名

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章