首先,還是一張思維導圖,看看本文主要內容:

今天來熟悉一下,關於JVM調優常用的一些參數。
X或者XX開頭的都是非轉標准化參數

意思就是說准表化參數不會變,非標准化參數可能在每個JDK版本中有所變化,但是就目前來看X開頭的非標准化的參數改變的也是非常少。
格式:-XX:[+-]
例子:-XX:+UseG1GC(表示啟用G1垃圾收集器)
堆設置
-Xms 初始堆大小,ms是memory start的簡稱 ,等價於-XX:InitialHeapSize
-Xmx 最大堆大小,mx是memory max的簡稱 ,等價於參數-XX:MaxHeapSize
注意:在通常情況下,服務器項目在運行過程中,堆空間會不斷的收縮與擴張,勢必會造成不必要的系統壓力。
所以在生產環境中,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。
-XX:MaxPermSize=n 設置持久代大小,
-XX:MetaspaceSize 設置元空間大小 。
收集器設置
-XX:+UseSerialGC 設置串行收集器-XX:+UseParallelGC 設置並行收集器-XX:+UseParalledlOldGC 設置並行年老代收集器-XX:+UseConcMarkSweepGC 設置並發收集器
垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filenameGC日志輸出到文件里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設置過的相關參數
Dump異常快照
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
堆內存出現OOM的概率是所有內存耗盡異常中最高的,出錯時的堆內信息對解決問題非常有幫助。
所以給JVM設置這個參數(-XX:+HeapDumpOnOutOfMemoryError),讓JVM遇到OOM異常時能輸出堆內信息,並通過(-XX:+HeapDumpPath)參數設置堆內存溢出快照輸出的文件地址。
這對於特別是對相隔數月才出現的OOM異常尤為重要。
-Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError
表示發生OOM后,運行jconsole.exe程序。
這里可以不用加“”,因為jconsole.exe路徑Program Files含有空格。利用這個參數,我們可以在系統OOM后,自定義一個腳本,可以用來發送郵件告警信息,可以用來重啟系統等等。
-XX:OnOutOfMemoryError="C:Program FilesJavajdk1.8.0_151binjconsole.exe"
8G內存的服務器該如何設置
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:
16m
-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參數,不要覺得很枯燥,因為大神都是一步一步來的,后面實戰中你就知道這些參數的重要性了。
敬請期待后續調優實戰!
