首先,仍是一張思惟導圖,看看本文主要內容:
java
今天來熟悉一下,關於JVM
調優經常使用的一些參數。
服務器
X或者XX開頭的都是非轉標準化參數併發
意思就是說準表化參數不會變,非標準化參數可能在每一個JDK
版本中有所變化,可是就目前來看X開頭的非標準化的參數改變的也是很是少。app
格式:-XX:[+-]<name> 表示啓用或者禁用name屬性。
例子:-XX:+UseG1GC(表示啓用G1垃圾收集器)
-Xms
初始堆大小,ms是memory start的簡稱 ,等價於-XX:InitialHeapSize
-Xmx
最大堆大小,mx是memory max的簡稱 ,等價於參數-XX:MaxHeapSize
ide
注意:在一般狀況下,服務器項目在運行過程當中,堆空間會不斷的收縮與擴張,勢必會形成沒必要要的系統壓力。spa
因此在生產環境中,
JVM
的Xms
和Xmx
要設置成同樣的,可以避免GC
在調整堆大小帶來的沒必要要的壓力。操作系統
-XX:NewSize=n
設置年輕代大小-XX:NewRatio=n
設置年輕代和年老代的比值。如:-XX:NewRatio=3
,表示年輕代與年老代比值爲1:3,年輕代佔整個年輕代年老代和的1/4,默認新生代和老年代的比例=1:2。-XX:SurvivorRatio=n
年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個,默認是8,表示線程
Eden:S0:S1=8:1:1
日誌
如:-XX:SurvivorRatio=3
,表示Eden:Survivor
=3:2,一個Survivor區佔整個年輕代的1/5。code
-XX:MaxPermSize=n
設置持久代大小,
-XX:MetaspaceSize
設置元空間大小 。
-XX:+UseSerialGC
設置串行收集器-XX:+UseParallelGC
設置並行收集器-XX:+UseParalledlOldGC
設置並行年老代收集器-XX:+UseConcMarkSweepGC
設置併發收集器
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
GC日誌輸出到文件裏filename
,好比:-Xloggc:/gc.log
-XX:ParallelGCThreads=n
設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis=n
設置並行收集最大暫停時間
-XX:GCTimeRatio=n
設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
-XX:MaxGCPauseMillis=n
設置並行收集最大暫停時間
-XX:+CMSIncrementalMode
設置爲增量模式。適用於單CPU狀況。-XX:ParallelGCThreads=n
設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數。
-XX:+PrintCommandLineFlags
查看當前JVM
設置過的相關參數
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
堆內存出現OOM
的機率是全部內存耗盡異常中最高的,出錯時的堆內信息對解決問題很是有幫助。
因此給JVM
設置這個參數(-XX:+HeapDumpOnOutOfMemoryError
),讓JVM
遇到OOM
異常時能輸出堆內信息,並經過(-XX:+HeapDumpPath
)參數設置堆內存溢出快照輸出的文件地址。
這對於特別是對相隔數月纔出現的OOM
異常尤其重要。
-Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\study\log_hprof\gc.hprof
-XX:OnOutOfMemoryError
表示發生OOM後
,運行jconsole.exe
程序。
這裏能夠不用加「」,由於jconsole.exe
路徑Program Files含有空格。利用這個參數,咱們能夠在系統OOM
後,自定義一個腳本,能夠用來發送郵件告警信息,能夠用來重啓系統等等。
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-Xmx3500m
設置JVM
最大可用內存爲3550M。
-Xms3500m
設置JVM
促使內存爲3550m
。此值能夠設置與-Xmx
相同,以免每次垃圾回收完成後JVM從新分配內存。-Xmn2g
設置年輕代大小爲2G
。
整個堆大小=年輕代大小 + 年老代大小 + 方法區大小
-Xss128k
設置每一個線程的堆棧大小。
JDK1.5
之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。
-XX:NewRatio=4
設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5 。
-XX:SurvivorRatio=4
設置年輕代中Eden區與Survivor區的大小比值。
設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6 -XX:MaxPermSize=16m
設置持久代大小爲16m。
-XX:MaxTenuringThreshold=0
設置垃圾最大年齡。
若是設置爲0的話,則年輕代對象不通過Survivor區,直接進入年老代。對於年老代比較多的應用,能夠提升效率。若是將此值設置爲一個較大值,則年輕代對象會在Survivor區進行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收的概論。
這是最基本的JVM參數,不要以爲很枯燥,由於大神都是一步一步來的,後面實戰中你就知道這些參數的重要性了。
敬請期待後續調優實戰!