手把手教你設置JVM調優參數


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

今天來熟悉一下,關於JVM調優常用的一些參數。

X或者XX開頭的都是非轉標准化參數

意思就是說准表化參數不會變,非標准化參數可能在每個JDK版本中有所變化,但是就目前來看X開頭的非標准化的參數改變的也是非常少。

格式:-XX:[+-] 表示啟用或者禁用name屬性。
例子:-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參數,不要覺得很枯燥,因為大神都是一步一步來的,后面實戰中你就知道這些參數的重要性了。

敬請期待后續調優實戰!


免責聲明!

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



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