Java VM 啓動參數詳解
@Date 2017.05.24
打印輸出相關參數
-verbose
- 打印加載類的詳細信息
-verbose:gc
- 打印虛擬機中GC的詳細情況:顯示最忙和最空閒收集行爲發生的時間、收集前後的內存大小、收集需要的時間等
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof
- 虛擬機在出現內存溢出異常時Dump 出當前的內存堆轉儲快照
-XX:+TraceClassLoading
- 打印加載類的詳細信息
-XX:+PrintGCDetails
- 詳細瞭解GC中的變化
-XX:+PrintGCDateStamps
- 瞭解垃圾收集發生的時間,自JVM啓動以後以秒計量
-Xloggc:/home/admin/logs/gc.log
- GC日誌文件的路徑
涉及堆相關的參數
-server
- server模式下,新生代選擇的是並行GC,舊生代選擇的是並行GC
- client模式下,新生代選擇的是串行GC,舊生代選擇的是串行GC
-Xms2g
- 堆的初始值2g
-Xmx2g
- 堆的最大值2g
- PS:避免在運行時頻繁調整Heap的大小,通常-Xms與-Xmx的值設成一樣
-XX:MinHeapFreeRation=
- 空餘堆內存小於MinHeapFreeRation時,JVM會增大Heap到-Xmx指定的大小
-XX:MaxHeapFreeRation=
- 空餘堆內存大於MaxHeapFreeRation時,JVM會減小heap的大小到-Xms指定的大小
-Xmn1g
- 新生代堆大小1G
-XX:SurvivorRatio=8
- 默認32:1:1
- 新生代的Eden區:From區:To區的比例爲8:1:1
-XX:PermSize= (JDK7)
- 永久代大小
-XX:MaxPermSize= (JDK7)
- 永久代MAX大小
-XX:MetaspaceSize= (JDK8)
- 代替PermSize,元空間大小
-XX:MaxMetaspaceSize= (JDK8)
- 代替MaxPermSize,元空間最大值
回收算法
標記-清理
- 直接清理
- 效率高
- 產生內存碎片
標記-複製
- 兩塊內存區域,S1,S2
- 不存在內存碎片
- 佔用雙倍空間
標記-整理
- 在標記-清理之後,讓剩餘存活的對象都向一端移動,並更新引用其對象的指針
- 效率低
- 不產生碎片
分代收集算法
- 把Java堆分新生代和老年代
- 在新生代用複製算法
- 在老年代用標記-清理或標記-整理算法
垃圾清理類型
-XX:+UseSerialGC
- Serial GC
- 串行
- 使用簡單的標記、清除、壓縮方法對年輕代和年老代進行垃圾回收,即Minor GC和Major GC
- 適用於CPU配置較低,內存佔用較少的單獨Client應用模式
-XX:+UseParallelGC
- Parallel GC
- 並行
- 收集方式同Serial GC一樣
- 產生N個線程來進行年輕代的垃圾收集
- N默認=系統CPU核數
-XX:ParallelGCThreads=
- 設置Parallel GC線程數量
-XX:+UseParallelOldGC
- Parallel Old GC
- 方式同Parallel GC
- 主要是年輕代和年老代垃圾回收時都使用多線程收集
-XX:+UseConcMarkSweepGC
- 併發標記清除(CMS)收集器
- 短暫停頓併發收集器
- CMS-initial-mark:初始標記階段(stop the world)
- CMS-concurrent-mark : 和應用線程併發執行,標記可達的對象
- CMS-concurrent-preclean(CMS-concurrent-preclean-start,CMS-concurrent-preclean) : 預清理(標記和應用線程是併發執行的,有些對象的狀態在標記後會改變)
- CMS-concurrent-abortable-preclean : 進一步的預清理,減少Rescan階段時間.使用到參數(-XX:CMSMaxAbortablePrecleanTime)
- Rescan階段(stop the world) : 暫停應用線程,對對象進行重新掃描並標記
- CMS-concurrent-sweep : 併發的垃圾清理
- CMS-concurrent-reset : 下一次CMS GC重置相關數據結構
- 對年老代進行垃圾收集
- 年輕代使用的算法和Parallel一樣
- 適用於不能忍受長時間停頓要求快速響應的應用
- !!!FULL GC
- concurrent-mode-failure : CMS GC時,有新的對象要進入年老代,但是年老代空間不足
- promotion-failed : Young GC時,存活對象從Eden區到Survivor區,但是Survivor區空間不足,需要到年老代,年老代空間也不足
-XX:CMSMaxAbortablePrecleanTime=
- CMS GC在concurrent-abortable-preclean階段使用的參數
- 當abortable-preclean階段執行達到這個時間時纔會結束
-XX:+CMSClassUnloadingEnabled
- 避免Perm區滿引起的Full GC,開啓CMS回收Perm區
-XX:CMSInitiatingOccupancyFraction=
- 此參數值是一個比例(參考下一條)
-XX:+UseCMSInitiatingOccupancyOnly
- 如果設置了此參數
- 只有當年老代佔用達到了-XX:CMSInitiatingOccupancyFraction參數所設定的比例時纔會觸發CMS
-XX:ParallelCMSThreads=
- 設置CMS收集器的線程數量
-XX:+UseG1GC
- G1垃圾收集器
- 屬於分代收集器
- JDK7+,長遠目標時代替CMS收集器
- 並行的、併發的和增量式壓縮短暫停頓的垃圾收集器
- 縮短處理超大堆時產生的停頓
- 相對於CMS的優勢而言是內存碎片的產生率大大降低
- G1收集器和其他的收集器運行方式不一樣,不區分年輕代和年老代.它把堆空間劃分爲多個大小相等的區域,當進行垃圾收集時,它會優先收集存活對象較少的區域
- 採用Remembered Set來避免全堆掃描
-XX:MaxGCPauseMillis=200
- 設置GC的最大暫停時間爲200ms
- 如果MaxGCPauseMillis設置的過小,那麼GC就會頻繁,吞吐量就會下降
- 如果MaxGCPauseMillis設置的過大,應用程序暫停時間就會變長
-XX:G1HeapRegionSize=
- 設置的G1區域的大小
- 值是2的冪,範圍是1MB到32MB之間
-Dsun.rmi.dgc.server.gcInterval=2592000000
-Dsun.rmi.dgc.client.gcInterval=2592000000
- 存在RMI調用時,默認會每分鐘執行一次System.gc,可以通過此參數來設置大點的間隔
堆外內存相關參數
-XX:MaxDirectMemorySize=
- 指定了DirectByteBuffer分配空間限額
- DirectByteBuffer通過內存映射,使Java應用進程直接訪問與文件相關聯的虛擬地址空間,減少了文件拷貝帶來的開銷,提高了文件讀取效率
- 默認會調用Full GC來回收
-XX:+DisableExplicitGC
- 禁用Full GC顯示調用(禁用System.GC)
- 會出現OOM: 當系統各方面性能良好,無Full GC且DirectByteBuffer所佔用的空間大於-Xmx分配的空間.
因爲DirectByteBuffer會不斷地在Native堆分配空間,它的引用進入了Old區,Old區保存大量的引用,而不能被回收,最終會導致Native堆空間不足 - 可以通過設置-XX:MaxDirectMemorySize=幾十M,使OOM來得更早一些
-XX:+ExplicitGCInvokesConcurrent
- 使用此參數,在進行堆外內存Full GC時,使用CMS併發GC,減少單純的Full GC的卡頓時間,提高GC效率
other options
-Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=30000
- 設置默認的Http請求的連接超時時間和讀取超時時間
-Dfile.encoding=UTF-8
- 設置文件流編碼
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
- 開放8000端口,支持遠程DEBUG
SpringBoot啓動參數樣例
機器配置4核8G
java -server
-Xms2g
-Xmx2g
-Xmn1g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
-XX:MaxDirectMemorySize=1g
-XX:SurvivorRatio=10
-XX:+UseConcMarkSweepGC
-XX:CMSMaxAbortablePrecleanTime=5000
-XX:+CMSClassUnloadingEnabled
-XX:CMSInitiatingOccupancyFraction=80
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+ExplicitGCInvokesConcurrent
-Dsun.rmi.dgc.server.gcInterval=2592000000
-Dsun.rmi.dgc.client.gcInterval=2592000000
-XX:ParallelGCThreads=4
-Xloggc:/home/admin/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/admin/logs/java.hprof
-Djava.awt.headless=true
-Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=30000
-Dfile.encoding=UTF-8