Meituan ???: ????? ??? JVM ?? ????? ?????? ??? ?? ??????!
Aug 24, 2023 pm 03:25 PM
??? JVM
????? ???? ?? ????? ?????. JVM
調(diào)優(yōu)常用的一些參數(shù)。
X或者XX開頭的都是非標(biāo)準(zhǔn)化參數(shù)

意思就是說標(biāo)準(zhǔn)化參數(shù)不會(huì)變,非標(biāo)準(zhǔn)化參數(shù)可能在每個(gè)JDK
版本中有所變化,但是就目前來看X開頭的非標(biāo)準(zhǔn)化的參數(shù)改變的也是非常少。
格式:-XX:[+-]<name> 表示啟用或者禁用name屬性。 例子:-XX:+UseG1GC(表示啟用G1垃圾收集器)
-XX:+PrintCommandLineFlags
查看當(dāng)前JVM
JDK
???? ????? ???? ???? X? ???? ??? ????? ?? ???? ?????. ??-Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof??
-XX:+PrintCommandLineFlags
?? ??JVM
?? ???? ??: ??
JVM參數(shù)分類
根據(jù)JVM
參數(shù)開頭可以區(qū)分參數(shù)類型,共三類:“-
"、" -X
”、“-XX</ code>”,<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">JVM
參數(shù)開頭可以區(qū)分參數(shù)類型,共三類:“-
”、“-X
”、“-XX
”,
標(biāo)準(zhǔn)參數(shù)(-):所有的JVM實(shí)現(xiàn)都必須實(shí)現(xiàn)這些參數(shù)的功能,而且向后兼容;
例子:-verbose:class
,-verbose:gc
,-verbose:jni……
非標(biāo)準(zhǔn)參數(shù)(-X):默認(rèn)jvm實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有jvm實(shí)現(xiàn)都滿足,且不保證向后兼容;
例子:Xms20m
,-Xmx20m
,-Xmn20m
,-Xss128k……
-verbose:class
,-verbose:gc
,-verbose:jni…足,且不保證向后兼容; ????例子:<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba (27, 31, 35, 0.05);?? ??: "Operator Mono", Consolas, Monaco, Menlo, monospace;?? ???: break-all;??: rgb(239, 112, 96);">Xms20m< /code>,<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">-Xmx20m
,-Xmn20m
,-Xss128k…各個(gè)jvm實(shí)現(xiàn)會(huì)有所不同,將來可能會(huì)隨時(shí)取消,需要慎重使用;??<p data-tool="mdnice編輯器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">例子:<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31, 35, 0.05 );font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">-XX:+PrintGCDetails
, -XX:-UseParallelGC
,? ??? ="?? ??: 14px; ??: 2px 4px; ??? ??: 4px; ?? ???: 2px; ?? ??: 2px; ?? ??: rgba(27, 31, 35, 0.05); ?? ??: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">-XX:+PrintGCTimeStamps……-XX:+PrintGCDetails
,-XX:-UseParallelGC
,-XX:+PrintGCTimeStamps……
堆參數(shù)設(shè)置
-Xms
初始堆大小,ms是memory start的簡稱 ,等價(jià)于-XX:InitialHeapSize
-Xmx
最大堆大小,mx是memory max的簡稱 ,等價(jià)于參數(shù)-XX:MaxHeapSize
注意:在通常情況下,服務(wù)器項(xiàng)目在運(yùn)行過程中,堆空間會(huì)不斷的收縮與擴(kuò)張,勢必會(huì)造成不必要的系統(tǒng)壓力。
所以在生產(chǎn)環(huán)境中,
JVM
的Xms
和Xmx
要設(shè)置成大小一樣的,能夠避免GC
堆參數(shù)設(shè)置
-Xms
初始堆大小,ms是memory start的簡稱 ,等價(jià)于-XX:InitialHeapSize
-Xmx
最大堆大小,mx是memory max的簡稱 ,等價(jià)于參數(shù)-XX:MaxHeapSize
???? ??: 服常情況下, 服務(wù)器項(xiàng)目在運(yùn)行過程中,堆空間會(huì)不斷的收縮與擴(kuò)張, 勢必會(huì)造成不必要的系統(tǒng)壓力。??
所以在生產(chǎn)環(huán)境中,
JVM
?Xms
?Xmx
要設(shè)置成大小一樣的,能夠避免GC
? ? ?? ??? ? ????.??? ???="?? ??: 14px;??: 2px 4px;?? ??: 4px;??-???: 2px;??-??: 2px;??-??: rgba(27, 31, 35, 0.05) ;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">-XX:NewSize=n ?? ?? ?? ??
-XX:NewRatio=n
Young Generation? Old Generation? ??? ?????.-XX:NewSize=n
設(shè)置年輕代大小-XX:NewRatio=n
設(shè)置年輕代和年老代的比值。如:
-XX:NewRatio=3
,表示年輕代與年老代比值為1:3
,年輕代占整個(gè)年輕代年老代和的1/4,默認(rèn)新生代和老年代的比例=1:2
。-XX:SurvivorRatio=n
年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。注意Survivor區(qū)有兩個(gè),默認(rèn)是8,表示:
Eden:S0:S1=8:1:1
如:
-XX:SurvivorRatio=3
,表示Eden:Survivor
=3:2,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/5。元空間參數(shù)
-XX:MetaspaceSize:
?:Metaspace
空間初始大小,如果不設(shè)置的話,默認(rèn)是20.79M,這個(gè)初始大小是觸發(fā)首次Metaspace Full GC
-XX:NewRatio=3</ code >? Young ??? Old ??? ??? <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; ?? ??: rgba(27, 31, 35, 0.05); ?? ??: "Operator Mono", Consolas, Monaco, Menlo, monospace; ?? ???: break-all; ??: rgb(239, 112, 96) ;">1: 3
, ?? ??? ?? ?? ??? ?? ??? 1/4? ????,??? ? ???? ?? ??=1:2
.-XX:SurvivorRatio=n
?? ?? ? ?? ??? ??? ?? ?? ??? ?????. ????? ?? ??? ??? ??? ???? 8???. ?,Eden:S0:S1=8:1:1
?????:-XX:SurvivorRatio=3
, ??Eden: Survivor
=3:2, Survivor ??? ?? ?? ??? 1/5? ?????. ?????? ????
??-XX:MetaspaceSize:Metaspace
??? ?? ?????. ???? ?? ?? ???? 20.79M???. ? ?? ??? ?? ??? ?Metaspace Full GC
? ??. ??例如:
-XX:MetaspaceSize=256M
-XX:MetaspaceSize=256M
-XX:MaxMetaspaceSize:
Metaspace
最大值,默認(rèn)不限制大小,但是線上環(huán)境建議設(shè)置。例如:
-XX:MaxMetaspaceSize=256M
-XX:MinMetaspaceFreeRatio:最小空閑比,當(dāng)
Metaspace
發(fā)生 GC 后,會(huì)計(jì)算Metaspace
的空閑比,如果空閑比(空閑空間/當(dāng)前Metaspace
大小)小于此值,就會(huì)觸發(fā)Metaspace
擴(kuò)容。默認(rèn)值是 40 ,也就是 40%,例如 -XX:MinMetaspaceFreeRatio=40-XX:MaxMetaspaceFreeRatio:最大空閑比,當(dāng)
-XX:MaxMetaspaceSize:Metaspace
發(fā)生 GC 后,會(huì)計(jì)算Metaspace
的空閑比,如果空閑比(空閑空間/當(dāng)前 Metaspace 大小)大于此值,就會(huì)觸發(fā)Metaspace
釋放空間。默認(rèn)值是 70 ,也就是 70%,例如 -XX:MaxMetaspaceFreeRatio=70
?? ??
最大值,默認(rèn)不限???,但是線上環(huán)境建議設(shè)置。????例如:-XX:MaxMetaspaceSize=256M
????-XX:MinMetaspaceFreeRatio:最小空閑比,當(dāng)??????
發(fā)生 GC 后,會(huì)計(jì)算????
? ?? ??: 14px; ??: 2px 4px; ??? ??: 4px; ?? ???: 2px; ?? ??: 2px; ???: rgba(27, 31, 35, 0.05); ?? ??: "Operator Mono" , Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">?????? 大小)小于此值,就會(huì)觸發(fā)??????
擴(kuò)容。默認(rèn)值是 40 ,也就是 40%,例如 - XX:MinMetaspaceFreeRatio=40????-XX:MaxMetaspaceFreeRatio:最大空閑比,當(dāng)????
發(fā)生 GC 后,會(huì)計(jì)算??????
??閑比,如果?閑比(????間/當(dāng)前 Metaspace 大小)大于此值,就會(huì)觸發(fā)????
釋放空間。默認(rèn)值是 70 ,也就是 70%,例如 -XX:MaxMetaspaceFreeRatio=70
??
MetaspaceSize
和MaxMetaspaceSize
設(shè)置為同樣大小,避免頻繁擴(kuò)容。棧參數(shù)設(shè)置
-Xss:??臻g大小,棧是線程獨(dú)占的,所以是一個(gè)線程使用??臻g的大小。
例如:
-Xss256K
,如果不設(shè)置此參數(shù),默認(rèn)值是1M
,一般來講設(shè)置成256K
?? ????? ?????.??? ???? ??
?? ??? ???(???)
???: -XX:+UseSerialGC ??: -XX:-UseSerialGC //???? Serial? ???? ???? SerialOld? ?????
ParNew ??? ???(???)
Enable -XX:+UseParNewGC -XX:-UseParNewGC ?? //???? ParNew ??? ???? ???? CMS
Parallel Scavenge Collector(???) ??? ?????
-XX:+UseParallelOldGC ??? -XX:-UseParallelOldGC ?? //??? ??? Parallel Scavenge ??? ?????. Old ??? Parallel Old Collector
ParallelOl ??? ???(?? ??)
enable -XX:+UseParallelGC? ?????. -XX:-UseParallelGC ?? //??? ??? Parallel Scavenge ??? ?????. Old ??? Parallel Old Collector
CMS ??? ???(?? ??)
enable -XX:+UseConcMarkSweepGC? ?????. -XX:-UseConcMarkSweepGC
G1 ??? ???
?? -XX:+UseG1GC ?? -XX:-UseG1GC
GC ?? ???? ??
GC ?? ?? ??? ?? ??? ???? ? ??? ???? ?? ?? ??? ??? ? ??? ??? ????? ?????
-XX: MaxGCPauseMillis
GC? ????? ? ?? ??? ?? ??? ????? Java ? ?? ??????. ?? ???? ?? Java ?? 45%???
-XX:InitiatingHeapOccupancyPercent=n
???? ??? ? ?? ?? ? ?? ??? ?? Old Generation? ?? ?????. .0? ??? ??? ?????.
-XX:PretenureSizeThreshold=1000000 //
Old Generation? ?? GC Age? ???? Young Generation ??? Old Generation ??? ?? Age ??? ?????. ???? 7
-XX: InitialTenuringThreshol=7
Old Generation? ????????. age, ???? 15
-XX :MaxTenuringThreshold
GC ?? ?? ??? ?
-XX:ParallelGCThreads=16
System.gc()? ???????. ? ???? ????? FGC? ????? ????? UseG1GC ? UseConcMarkSweepGC? ????? ??? ?? ? ???? ????? ? ????.
-XX:-+DisableExplicitGC
??? ?? ??, ???? 99
XX:GCTimeRatio
??? ??, ? ??? ??, ?? ???? ?? ??? ?????. ?? ????? ???? ?????. ???? ?? ?? ?? ?? ??? ?????.
XX:UseAdaptiveSizePolicy
???? ?? ??? ???? GC ??? ?? ??
GCTimeRatio
Dump異常快照
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
堆內(nèi)存出現(xiàn)
OOM
的概率是所有內(nèi)存耗盡異常中最高的,出錯(cuò)時(shí)的堆內(nèi)信息對(duì)解決問題非常有幫助。所以給
JVM
設(shè)置這個(gè)參數(shù)(-XX:+HeapDumpOnOutOfMemoryError
),讓JVM
遇到OOM
異常時(shí)能輸出堆內(nèi)信息,并通過(-XX:+HeapDumpPath
)參數(shù)設(shè)置堆內(nèi)存溢出快照輸出的文件地址。這對(duì)于特別是對(duì)相隔數(shù)月才出現(xiàn)的
OOM
異常尤為重要。-Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof
-XX:OnOutOfMemoryError
表示發(fā)生
OOM后
,運(yùn)行jconsole.exe
程序。這里可以不用加“”,因?yàn)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">jconsole.exe路徑Program Files含有空格。利用這個(gè)參數(shù),我們可以在系統(tǒng)
OOM
后,自定義一個(gè)腳本,可以用來發(fā)送郵件告警信息,可以用來重啟系統(tǒng)等等。-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"8G內(nèi)存的服務(wù)器該如何設(shè)置
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-Xmx3500m
設(shè)置JVM
最大可用內(nèi)存為3550M。
-Xms3500m
設(shè)置JVM
初始
內(nèi)存為3550m
。此值可以設(shè)置與-Xmx
相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。-Xmn2g
設(shè)置年輕代大小為2G
。整個(gè)堆大小=年輕代大小 + 年老代大小 + 方法區(qū)大小
-Xss128k
設(shè)置每個(gè)線程的堆棧大小。
JDK1.5
以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗(yàn)值在3000~5000左右。
-XX:NewRatio=4
設(shè)置年輕代(包括Eden和兩個(gè)Survivor區(qū))與年老代的比值(除去持久代)。設(shè)置為4,則年輕代與年老代所占比值為1:4,年輕代占整個(gè)堆棧的1/5 。
-XX:SurvivorRatio=4
設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設(shè)置為4,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:4,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/6
-XX:MaxPermSize=16m
設(shè)置持久代大小為16m。
-XX:MaxTenuringThreshold=0
設(shè)置垃圾最大年齡。如果設(shè)置為0的話,則年輕代對(duì)象不經(jīng)過Survivor區(qū),直接進(jìn)入年老代。對(duì)于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個(gè)較大值,則年輕代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象在年輕代的存活時(shí)間,增加在年輕代即被回收的概論。
項(xiàng)目中,GC日志配置
比如,我們啟動(dòng)一個(gè)user-service項(xiàng)目:
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:+PrintHeapAtGC -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -Xloggc:/opt/user-service-gc-%t.log -jar user-service-1.0-SNAPSHOT.jar參數(shù)解釋:
-Xloggc:/opt/app/ard-user/user-service-gc-%t.log 設(shè)置日志目錄和日志名稱 -XX:+UseGCLogFileRotation 開啟滾動(dòng)生成日志 -XX:NumberOfGCLogFiles=5 滾動(dòng)GC日志文件數(shù),默認(rèn)0,不滾動(dòng) -XX:GCLogFileSize=20M GC文件滾動(dòng)大小,需開啟UseGCLogFileRotation -XX:+PrintGCDetails 開啟記錄GC日志詳細(xì)信息(包括GC類型、各個(gè)操作使用的時(shí)間),并且在程序運(yùn)行結(jié)束打印出JVM的內(nèi)存占用情況 -XX:+ PrintGCDateStamps 記錄系統(tǒng)的GC時(shí)間 -XX:+PrintGCCause 產(chǎn)生GC的原因(默認(rèn)開啟)項(xiàng)目中沒用過怎么辦?
對(duì)于很多沒用過的人來說,面試官問項(xiàng)目中這些參數(shù)是怎么用?此時(shí),很容易選擇妥協(xié),傻傻的回答沒用過。
偷偷的告訴你,很多面試官也沒有用過。
另外,你可以自己搞個(gè)小項(xiàng)目,把
JVM
參數(shù)設(shè)置小點(diǎn),使用測試工具JMeter
,多線程測試一下。
? ??? Meituan ???: ????? ??? JVM ?? ????? ?????? ??? ?? ??????!? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)