Java VM 啓動參數詳解

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)收集器
  • 短暫停頓併發收集器
    1. CMS-initial-mark:初始標記階段(stop the world)
    2. CMS-concurrent-mark : 和應用線程併發執行,標記可達的對象
    3. CMS-concurrent-preclean(CMS-concurrent-preclean-start,CMS-concurrent-preclean) : 預清理(標記和應用線程是併發執行的,有些對象的狀態在標記後會改變)
    4. CMS-concurrent-abortable-preclean : 進一步的預清理,減少Rescan階段時間.使用到參數(-XX:CMSMaxAbortablePrecleanTime)
    5. Rescan階段(stop the world) : 暫停應用線程,對對象進行重新掃描並標記
    6. CMS-concurrent-sweep : 併發的垃圾清理
    7. CMS-concurrent-reset : 下一次CMS GC重置相關數據結構
  • 對年老代進行垃圾收集
  • 年輕代使用的算法和Parallel一樣
  • 適用於不能忍受長時間停頓要求快速響應的應用
  • !!!FULL GC
    1. concurrent-mode-failure : CMS GC時,有新的對象要進入年老代,但是年老代空間不足
    2. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章