JVM 參數配置



JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -Dcom.sun.management.jmxremote -Dcom.sun.management.snmp.port=8044 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

這個是我們線上服務器的設置(2c 4G)

  • 初始化堆內存:-XX:InitialHeapSize=2048m(-Xms2048m -簡寫)
  • 最大堆內存:-XX:MaxHeapSize=2048m (-Xmx2048m -簡寫)
  • 設置年輕代大小.:-Xmn512m 
  • 線程的堆棧大小:-Xss256k:設置每個線程的堆棧大小.JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需內存大小進行 調整.在相同物理內存下,減小這個值能生成更多的線程.但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右.
  • 初始化永久代堆內存: -XX:PermSize=512m
  • 最大永久代堆內存:-XX:MaxPermSize
  • Eden區與Survivor區的大小比值:-XX:SurvivorRatio=8    設置年輕代中Eden區與Survivor區的大小比值.設置為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的 1/10
  • 年輕代與老年代的比:-XX:NewRatio=4   設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代).設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5
  • 老年代垃圾收集器:CMS(Concurrent Mark Sweep)並發標記清理收集器:CMS(-XX:+UseConcMarkSweepGC)收集器在老年代使用,專門收集那些在主要回收中不可能到達的年老對象。它與應用程序並發執行,在年老代保持一直有足夠的空間以保證不會發生年輕代晉升失敗。
  • -XX:CMSFULLGCsBeforCompaction=5:由於並發收集器不對內存空間進行壓縮、整理,所以運行一段時間會產生“碎片”,使得運行效率低。此值設置運行多少次GC以后對內訓空間進行壓縮、整理。
  • -XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,但是可以消除碎片。
  • 為了減少第二次暫停的時間,開啟並行remark: -XX:+CMSParallelRemarkEnabled
  • CMS次數執行次數:默認CMS是在tenured generation沾滿68%的時候開始進行CMS收集,如果你的年老代增長不是那么快,並且希望降低CMS次數的話,可以適當調高此值:-XX:CMSInitiatingOccupancyFraction=80
  •  年輕代的垃圾收集器:-XX:+UseParNewGC:設置年輕代為並行收集。可以和CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行配置,所以無需再配置此值。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFULLGCsBeforCompaction=5 -XX:+UseCMSCompactAtFullCollection

垃圾年齡設置:

-XX:MaxTenuringThreshold=0:設置垃圾最大年齡.如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代. 對於年老代比較多的應用,可以提高效率.如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活 時間,增加在年輕代即被回收的概率

回收器選擇

JVM給了三種選擇:串行收集器,並行收集器,並發收集器,但是串行收集器只適用於小數據量的情況,所以這里的選擇主要針對並行收集器和並發收集器.默認 情況下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啟動時加入相應參數.JDK5.0以后,JVM會根據當前系統配置進行判斷:選擇吞吐量優先的並行收集器。

我們也可以自行設置:

-XX:+UseParallelGC:選擇垃圾收集器為並行收集器.此配置僅對年輕代有效.即上述配置下,年輕代使用並發收集,而年老代仍舊使用串行收集.
-XX:ParallelGCThreads=20:配置並行收集器的線程數,即:同時多少個線程一起進行垃圾回收.此值最好配置與處理器數目相等.

JVM參數的打印

-XX:+PrintGC
輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] 
[Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails
輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] 
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可與上面兩個混合使用
輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

設置GC日志文件滾動,滾動個數為5,日志文件大小的200M,日志文件路徑/home/admin/logs/gc.log。

-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中斷的執行時間.可與上面混合使用
輸出形式:Application time: 0.5291524 seconds

-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期間程序暫停的時間.可與上面混合使用
輸出形式:Total time for which application threads were stopped: 0.0468229 seconds

-XX:PrintHeapAtGC:打印GC前后的詳細堆棧信息

例如:

-XX:+PrintGCDetails -XX:+PringGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=200M
-Xloggc:/home/admin/logs/gc.log

 

內存溢出時打印異常快照

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\oom.dump

 

關於JDK1.8的優化

元空間是方法區的在HotSpot jvm 中的實現,方法區主要用於存儲類的信息、常量池、方法數據、方法代碼等。方法區邏輯上屬於堆的一部分,但是為了與堆進行區分,通常又叫“非堆”。元空間的本質和永久代類似,都是對JVM規范中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。,理論上取決於32位/64位系統可虛擬的內存大小。可見也不是無限制的,需要配置參數。

1.MetaspaceSize

  -XX:MetaspaceSize :初始化的Metaspace大小,控制元空間發生GC的閾值。GC后,動態增加或降低MetaspaceSize。在默認情況下,這個值大小根據不同的平台在12M到20M浮動。

2.MaxMetaspaceSize

  -XX:MaxMetaspaceSize:限制Metaspace增長的上限,防止因為某些情況導致Metaspace無限的使用本地內存,影響到其他程序。在本機上該參數的默認值為4294967295B(大約4096MB)。

3.MinMetaspaceFreeRatio

  -XX:MinMetaspaceFreeRatio:當進行過Metaspace GC之后,會計算當前Metaspace的空閑空間比,如果空閑比小於這個參數(即實際非空閑占比過大,內存不夠用),那么虛擬機將增長Metaspace的大小。默認值為40,也就是40%。設置該參數可以控制Metaspace的增長的速度,太小的值會導致Metaspace增長的緩慢,Metaspace的使用逐漸趨於飽和,可能會影響之后類的加載。而太大的值會導致Metaspace增長的過快,浪費內存。

4.MaxMetasaceFreeRatio

  -XX:MaxMetaspaceFreeRatio:當進行過Metaspace GC之后, 會計算當前Metaspace的空閑空間比,如果空閑比大於這個參數,那么虛擬機會釋放Metaspace的部分空間。默認值為70,也就是70%。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM