溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM的參數(shù)有哪些

發(fā)布時(shí)間:2021-12-18 15:26:45 來源:億速云 閱讀:158 作者:iii 欄目:云計(jì)算

這篇文章主要講解了“JVM的參數(shù)有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JVM的參數(shù)有哪些”吧!

垃圾收集策略:
    垃圾收集的3種模式:
        Serial GC
            串行收集:適合內(nèi)存有限的情況,回收慢。
        Parallel GC
            并行收集:效率高,當(dāng)Heap較大時(shí),系統(tǒng)暫停時(shí)間較長。
        CMS GC 
            并發(fā)收集:Old區(qū)回收暫停時(shí)間短,整個(gè)GC耗時(shí)較長、比較耗CPU資源。

    參數(shù):
        Serial GC:
            -XX:+UseSerialGC         使用串行收集模式,即使用Serail + Serail Old 進(jìn)行回收。虛擬機(jī)運(yùn)行在client模式下的默認(rèn)選項(xiàng)。
            
        Parallel GC:
            -XX:+UseParallelGC        使用Parallel Scavenge + Serail Old 進(jìn)行回收。虛擬機(jī)運(yùn)行在server模式下的默認(rèn)選項(xiàng)。
        
            -XX:+UseParNewGC        使用ParNew + Serial Old 來進(jìn)行回收。設(shè)置新生代的收集器為ParNew收集器(并行收集器)。該設(shè)置默認(rèn)是關(guān)閉的,打開該開關(guān)后,jvm會(huì)使用 ParNew + Serial Old 來進(jìn)行g(shù)c。
            -XX:ParallelGCThreads    ParNew收集器的收集線程數(shù),默認(rèn)與CPU的數(shù)量相同。

            -XX:+UseParallelOldGC     使用Parallel Scavenge + Parallel Old進(jìn)行回收。
            
        CMS GC:
            -XX:+UseConcMarkSweepGC                    使用ParNew + CMS收集器(并發(fā)收集失敗(Concurrent Mode Failure)后使用Serial Old收集器)
            -XX:+CMSParallelRemarkEnabled            開啟并行remark,以減少remark時(shí)程序暫停的時(shí)間。
            -XX:CMSInitiatingOccupancyFraction=70    當(dāng)老年代的空間被占用70%后,CMS收集器開始gc。
                                                        1>JVM會(huì)收集對象分配和釋放的運(yùn)行時(shí)數(shù)據(jù),并且通過分析這些數(shù)據(jù)來決定什么時(shí)候應(yīng)該進(jìn)行一次gc(即:啟動(dòng)一次CMS垃圾收集器)。
                                                        2>為了引導(dǎo)這一過程,JVM會(huì)在啟動(dòng)CMS收集器前進(jìn)行一些線索查找,該線索由-XX:CMSInitiatingOccupancyFraction來設(shè)置,該值表示老年代的使用率。
            
            -XX:+UseCMSInitiatingOccupancyOnly        命令JVM不要根據(jù)運(yùn)行時(shí)收集的數(shù)據(jù)來判斷什么時(shí)候開始gc,而是根據(jù)CMSInitiatingOccupancyFraction的值來判斷是否進(jìn)行CMS收集。注意:一般不會(huì)打開該開關(guān)。
            
            -XX:+UseCMSCompactAtFullCollection        CMS收集器在gc時(shí),允許對老年代進(jìn)行壓縮,解決因標(biāo)記-清除算法導(dǎo)致的內(nèi)存碎片的問題。
            -XX:CMSFullGCsBeforeCompaction=0        CMS收集器gc多少次后進(jìn)行內(nèi)存壓縮(整理),由于CMS收集器使用的是標(biāo)記-清除算法,所以CMS在gc后會(huì)產(chǎn)生內(nèi)存碎片,使得運(yùn)行效率降低。
            
            -XX:+CMSClassUnloadingEnabled            開啟CMS收集器對永久代的gc(默認(rèn)不會(huì)對永久代進(jìn)行g(shù)c)。
            -XX:CMSInitiatingPermOccupancyFraction    設(shè)置永久代使用到達(dá)多少比率時(shí)觸發(fā)CMS收集器的gc

            -XX:+DisableExplicitGC                    禁止System.gc(),避免因開發(fā)人員不恰當(dāng)?shù)卣{(diào)用System.gc()方法對系統(tǒng)性能造成的不良的影響。
            -Xnoclassgc                                禁用類垃圾回收功能,也就避免了同一個(gè)類的加載、卸載、(再次用到該類時(shí))再加載的操作,性能會(huì)高一點(diǎn)。
                                                        1>虛擬機(jī)加載類的過程中包含了IO和內(nèi)存分配等操作,故JVM在加載類時(shí)會(huì)對性能產(chǎn)生一定的影響。
            
            -XX:+UseFastAccessorMethods                優(yōu)化原始類型的getter方法的性能,默認(rèn)開啟。
            -XX:+PrintClassHistogram                 遇到Ctrl+Break中斷,打印類實(shí)例的柱狀信息,與jmap -histo功能相同
            
            -XX:SoftRefLRUPolicyMSPerMB=0            設(shè)置每兆堆空閑空間中軟引用(SoftReference)的存活時(shí)間,默認(rèn)值為1(秒)。
                                                        1>softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap.
                                                        2>SoftReference是在gc時(shí)才被回收,故SoftReference實(shí)際的存活時(shí)間可能比這個(gè)設(shè)定的值要大。
                                                        3>一般情況下,建議設(shè)置為0。
            
        
輔助信息:
    -XX:+PrintGCDetails            打印GC的詳細(xì)信息
    -XX:+PrintGCTimeStamps        打印GC的時(shí)間戳
    -XX:+PrintHeapAtGC             打印GC前后堆棧的詳細(xì)信息
    -Xloggc:                    設(shè)置gc的log日志。eg:-Xloggc:$CATALINA_BASE/logs/gc.log


    
    
堆棧:    
    【堆】
    -Xms 或 -XX:InitialHeapSize        初始堆大小,默認(rèn)空余堆內(nèi)存小于40%(MinHeapFreeRatio參數(shù)可以調(diào)整)時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制。
    -Xmx 或 -XX:MaxHeapSize            最大堆大小,默認(rèn)空余堆內(nèi)存大于70%(MaxHeapFreeRatio參數(shù)可以調(diào)整)時(shí),JVM會(huì)減少堆直到-Xms的最小限制。
    -Xmn                            新生代大?。?br/>                                         1>新生代越大也就意味著會(huì)有更多的對象在minor GC期間被回收,如果設(shè)置的太大,則老年代就變小了,可能會(huì)頻繁觸發(fā)Full GC,甚至是OOM。
                                        2>如果新生代設(shè)置的太小,則會(huì)導(dǎo)致minor GC更加頻繁,進(jìn)而會(huì)導(dǎo)致更多的對象直接進(jìn)入老年代,當(dāng)老年代已使用的空間到達(dá)一定比例時(shí),會(huì)觸發(fā)Full GC。
                            
    -XX:NewSize            設(shè)置新生代大小
    -XX:NewRatio        新生代(Eden+2個(gè)Survivor)最大容量與老年代最大容量的比值,默認(rèn)為2,即:NewSize : OldSize = 1:2     注意:該參數(shù)的值=老年代最大容量大小/新生代最大容量大小。
                        eg:jstat -gccapacity PID # 查看NGCMX、OGCMN 即可驗(yàn)證。
    -XX:SurvivorRatio    設(shè)置Eden與1個(gè)Survivor的比值,默認(rèn)為8,即 Eden : Survivor1 : Survivor2 = 8:1:1
                            1>Eden越大也就意味著發(fā)生minor GC的頻率越低,如果Eden設(shè)置的太大,造成Survivor太小,則會(huì)導(dǎo)致要回收的對象在minor GC后就直接進(jìn)入老年代,從而更頻繁地觸發(fā)Full GC。

        
    【棧】
    -Xss                每個(gè)線程的棧大?。?br/>                             1>在相同物理內(nèi)存下:減小這個(gè)值能生成更多的線程,但是操作系統(tǒng)對一個(gè)進(jìn)程內(nèi)的線程數(shù)是有限制的,不能無限生成(網(wǎng)上說是3k-5k左右,沒有做過測試)。
                            2>一般比較小的系統(tǒng),如果棧不是很深,則128k就夠用了,較大的系統(tǒng)則應(yīng)設(shè)置為256k。
                            3>jdk5之后,每個(gè)線程堆棧大小默認(rèn)為1M。
                        
    【永久代】                        
    -XX:PermSize        設(shè)置永久代初始值
    -XX:MaxPermSize        設(shè)置持久代最大值
    
    
    【其它】
    -XX:+TraceClassLoading            跟蹤類加載和卸載的信息,一般我們在排查內(nèi)存泄露、jar包版本沖突等問題時(shí)會(huì)添加這個(gè)參數(shù)。
    -XX:-OmitStackTraceInFastThrow
        說明:
            jdk1.5后,為了提高性能,JVM在以Server模式運(yùn)行時(shí),當(dāng)一些異常在代碼里某個(gè)特定位置被拋出很多次后,編譯器(C2)會(huì)對該方法進(jìn)行重編譯,重編譯后,若再次出現(xiàn)該異常,則會(huì)拋出一個(gè)提前準(zhǔn)備好的沒有調(diào)用棧的異常。通過 -XX:-OmitStackTraceInFastThrow 可以禁用該默認(rèn)的優(yōu)化。
        官方:
            The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions.
            For performance purposes, when such an exception is thrown a few times, the method may be recompiled.
            After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace.

    -XX:LargePageSizeInBytes=128    設(shè)置內(nèi)存頁的大小
    -XX:MaxTenuringThreshold        GC最大年齡
                                        1>如果設(shè)置為0,則新生代對象不經(jīng)過Survivor區(qū),直接進(jìn)入老年代。對于老年代中對象比較多的應(yīng)用,可以提高效率。                                    2>如果設(shè)置為一個(gè)較大的值,則新生代對象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對象在新生代的存活時(shí)間,增加對象在新生代被回收的概率,該參數(shù)只有在串行GC時(shí)才有效。


域名解析:
    -Dsun.net.spi.nameservice.provider.1=dns,sun     指定域名解析器 https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html
    舉例:無法解析某個(gè)域名,報(bào)java.net.UnknownHostException錯(cuò)誤
    解決:啟動(dòng)的時(shí)候添加參數(shù) -Dsun.net.spi.nameservice.provider.1=dns,sun

    
    
補(bǔ)充:
    -XX:CMSInitiatingOccupancyFraction與-Xmn之間的關(guān)系:

        內(nèi)存分配擔(dān)保失敗(promontion faild)的原因:
            1)Minor GC時(shí),將eden和survivor from中存活的對象復(fù)制到survivor to中的時(shí)候,如果survivor to容納不下這些對象,那么這些對象將晉升到老年代,
            2)此時(shí),如果老年代中剩余的空間也無法容納下這些對象,那么就會(huì)導(dǎo)致內(nèi)存分配擔(dān)保失敗(promontion faild),進(jìn)而引發(fā)了full gc。
            
                結(jié)論:當(dāng)新生代與老年代滿足 eden + survivor from <= 老年代剩余的空間 關(guān)系時(shí),promontion faild就不會(huì)發(fā)生。
                
                即:eden + survivor from <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)
                
                    由方程組:    
                        Eden / Survivor=SurvivorRatio
                        Eden + 2Survivor=Xmn

                        Survivor * SurvivorRatio + 2Survivor = Xmn        ===>    Survivor = Xmn/(SurvivorRatio+2)
                        
                    可得出:    
                        Eden + Survivor = Xmn-Survivor = Xmn - Xmn/(SurvivorRatio+2)
                
                即:Xmn - Xmn/(SurvivorRatio+2) <= (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)
            
            簡化:
                CMSInitiatingOccupancyFraction <= (1 - (Xmn-Xmn/(SurvivorRatio+2))/(Xmx-Xmn)) * 100
                eg:如果 -Xms8G -Xmx8G -Xmn3G -XX:SurvivorRatio=8,則 CMSInitiatingOccupancyFraction <= (1 - (3-3/(8+2))/(8-3))) = 46%
            
        
                CMSInitiatingOccupancyFraction低于70% 需要調(diào)整xmn或SurvivorRatior值。
    
    
===================================================================================
    
網(wǎng)上某大牛的配置,據(jù)稱可以支持每天幾百萬的pv。

    JAVA_OPTS="
    -Dresin.home=$SERVER_ROOT
    -server
    -Xms6000M
    -Xmx6000M
    -Xmn500M
    -XX:PermSize=500M
    -XX:MaxPermSize=500M
    -XX:SurvivorRatio=65536
    -XX:MaxTenuringThreshold=0
    -Xnoclassgc
    -XX:+DisableExplicitGC
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
    -XX:+UseCMSCompactAtFullCollection
    -XX:CMSFullGCsBeforeCompaction=0
    -XX:+CMSClassUnloadingEnabled
    -XX:+CMSParallelRemarkEnabled
    -XX:CMSInitiatingOccupancyFraction=90
    -XX:SoftRefLRUPolicyMSPerMB=0
    -XX:+PrintClassHistogram
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -XX:+PrintHeapAtGC
    -Xloggc:log/gc.log"
        
        
    說明:
        1)-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0    表示在新生代中去掉了Survivor,即新生代中只有Eden

===================================================================================

感謝各位的閱讀,以上就是“JVM的參數(shù)有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對JVM的參數(shù)有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI