JVM真香系列:手把手教你設置JVM調優參數

首先,仍是一張思惟導圖,看看本文主要內容:
java

d29c87b448f4a46e6b31f835561c7dc1.png

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

X或者XX開頭的都是非轉標準化參數併發

2d879e49dd4fef8bd161698a1686629b.png

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

格式:-XX:[+-]<name> 表示啓用或者禁用name屬性。
例子:-XX:+UseG1GC(表示啓用G1垃圾收集器)



堆設置

-Xms 初始堆大小,ms是memory start的簡稱 ,等價於-XX:InitialHeapSize
-Xmx 最大堆大小,mx是memory max的簡稱 ,等價於參數-XX:MaxHeapSizeide

注意:在一般狀況下,服務器項目在運行過程當中,堆空間會不斷的收縮與擴張,勢必會形成沒必要要的系統壓力。spa

因此在生產環境中,JVMXmsXmx要設置成同樣的,可以避免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  設置元空間大小 。

收集器設置

56371d3853996ea5372df4c2a7b931f9.png

-XX:+UseSerialGC 設置串行收集器
-XX:+UseParallelGC 設置並行收集器
-XX:+UseParalledlOldGC 設置並行年老代收集器
-XX:+UseConcMarkSweepGC 設置併發收集器


垃圾回收統計信息

56371d3853996ea5372df4c2a7b931f9.png

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filenameGC日誌輸出到文件裏filename好比:-Xloggc:/gc.log



並行收集器設置

56371d3853996ea5372df4c2a7b931f9.png

-XX:ParallelGCThreads=n 設置並行收集器收集時使用的CPU數。並行收集線程數。

-XX:MaxGCPauseMillis=n 設置並行收集最大暫停時間

-XX:GCTimeRatio=n 設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)

-XX:MaxGCPauseMillis=n設置並行收集最大暫停時間



併發收集器設置

56371d3853996ea5372df4c2a7b931f9.png

-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: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"



8G內存的服務器該如何設置

56371d3853996ea5372df4c2a7b931f9.png


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參數,不要以爲很枯燥,由於大神都是一步一步來的,後面實戰中你就知道這些參數的重要性了。

敬請期待後續調優實戰!

相關文章
相關標籤/搜索