溫馨提示×

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

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

JDK1.8中JVM架構(gòu)調(diào)整、分析與調(diào)優(yōu)的示例分析

發(fā)布時(shí)間:2021-12-17 13:47:10 來(lái)源:億速云 閱讀:290 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下JDK1.8中JVM架構(gòu)調(diào)整、分析與調(diào)優(yōu)的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一.JVM空間說(shuō)明

  1. JDK 1.7及以前,Java 類信息、常量池、靜態(tài)變量都存儲(chǔ)在 Perm(永久代)里。類的元數(shù)據(jù)和靜態(tài)變量在類加載的時(shí)候分配到 Perm,當(dāng)類被卸載的時(shí)候垃圾收集器從 Perm 處理掉。

  2. JDK 1.8 的對(duì) JVM 架構(gòu)的改造將類元數(shù)據(jù)放到本地內(nèi)存中,另外,將常量池靜態(tài)變量放到 Java 堆里。HotSopt VM 將會(huì)為類的元數(shù)據(jù)明確分配和釋放本地內(nèi)存。在這種架構(gòu)下,類元信息就突破了原來(lái) -XX:MaxPermSize 的限制,所以PermSize的配置也是無(wú)效的,現(xiàn)在可以使用更多的本地內(nèi)存。這樣就從一定程度上解決了原來(lái)在運(yùn)行時(shí)生成大量類的造成經(jīng)常 Full GC 問(wèn)題,如運(yùn)行時(shí)使用反射、代理等

JDK1.8中JVM架構(gòu)調(diào)整、分析與調(diào)優(yōu)的示例分析

干貨:可以發(fā)現(xiàn)最明顯的一個(gè)變化是  元空間從虛擬機(jī)轉(zhuǎn)移到本地內(nèi)存;默認(rèn)情況下,元空間的大小僅受本地內(nèi)存的限制。這意味著以后不會(huì)因?yàn)橛谰么臻g不夠而拋出OOM異常了。  
jdk1.8以前版本的class和jar包數(shù)據(jù)存儲(chǔ)在permGen下面 ,permGen大小是固定的,而且項(xiàng)目之間無(wú)法共用公有的class,所以很容易碰到OOM異常。  
改成metaSpaces后,各個(gè)項(xiàng)目會(huì)共享同樣的class內(nèi)存空間,比如多個(gè)項(xiàng)目都引用了apache-common包,在metaSpaces中只會(huì)存儲(chǔ)一份apache-common的class,提高了內(nèi)存的利用率,垃圾回收更有效率。

二.JVM參數(shù)配置

  1. 在jdk1.8以前,生產(chǎn)環(huán)境一般有如下配置

    -XX:PermSize=512M -XX:MaxPermSize=1024M


表示在JVM里存儲(chǔ)Java類信息,常量池和靜態(tài)變量的永久代區(qū)域初始大小為512M,最大為1024M。在項(xiàng)目啟動(dòng)后,這個(gè)值是固定的,如果項(xiàng)目class過(guò)多,很可能遇到  OutOfMemoryError: PermGen異常。


2、升級(jí)JDK1.8之后,上面的perm配置已經(jīng)變成

-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M

MetaspaceSize如果不做配置,通過(guò)jinfo查看默認(rèn)MetaspaceSize大?。s21M),MaxMetaspaceSize很大很大,前面說(shuō)過(guò)MetaSpace只受本地內(nèi)存大小限制。

jinfo -flag MetaspaceSize 1234  #結(jié)果為:-XX:MetaspaceSize=21807104
jinfo -flag MaxMetaspaceSize 1234 #結(jié)果為:-XX:MaxMetaspaceSize=18446744073709547520

 干貨:MetaspaceSize為出發(fā)FullGC的閾值,默認(rèn)約為21M,如做了配置,最小閾值為自定義配置大小??臻g使用達(dá)到閾值,觸發(fā)FullGC,同時(shí)對(duì)該值擴(kuò)大。當(dāng)然如果元空間實(shí)際使用小于閾值,在GC的時(shí)候也會(huì)對(duì)該值縮小。
MaxMetaspaceSize為元空間的最大值,如果設(shè)置太小,可能會(huì)導(dǎo)致頻繁FullGC,甚至OOM。

三.GC(GarbageCollection)過(guò)程

首先貼一張網(wǎng)上盜來(lái)的大圖,用它來(lái)說(shuō)明下GC的過(guò)程再合適不過(guò)。

JDK1.8中JVM架構(gòu)調(diào)整、分析與調(diào)優(yōu)的示例分析

  • 新new的對(duì)象都放在Eden區(qū)(伊甸園嘛,創(chuàng)造的地方

  • Eden區(qū)滿或者快滿的時(shí)候進(jìn)行一次清理(Minor Gc),不被引用的對(duì)象直接被干掉;還有引用的對(duì)象,但是年齡比較大的,挪到S0區(qū)

  • 下次Eden區(qū)快滿的時(shí)候,會(huì)進(jìn)行上一步的操作,并且將Eden和S0區(qū)的年紀(jì)大的對(duì)象放到S1區(qū)【原理上隨時(shí)保持S0和S1有一個(gè)是空的,用來(lái)存下一次的對(duì)象】

  • 下下次,Eden區(qū)快滿的時(shí)候,會(huì)進(jìn)行上一步操作,并且將Eden和S1區(qū)的年紀(jì)大的對(duì)象放到S0區(qū)【此時(shí)S1區(qū)就是空的】

  • 直到Eden區(qū)快滿,S0或者S1也快滿的時(shí)候,這時(shí)候就把這兩個(gè)區(qū)的年紀(jì)大的對(duì)象放到Old區(qū)

  • 依次循環(huán),直到Old區(qū)也快滿的時(shí)候,Eden區(qū)也快滿的時(shí)候,會(huì)對(duì)整個(gè)這一塊內(nèi)存區(qū)域進(jìn)行一次大清洗(FullGC),騰出內(nèi)存,為之后的對(duì)象創(chuàng)建,程序運(yùn)行騰地方。

清理Eden區(qū)和Survivor區(qū)叫Minor GC;清理Old區(qū)叫Major GC;清理整個(gè)堆空間—包括年輕代和老年代叫Full GC。

四. JVM參數(shù)配置指南

前面三個(gè)部分對(duì)JVM進(jìn)行了整體的了解,接下來(lái)是本文的重點(diǎn)。

-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -Xms256m -Xmx256m

文章看下來(lái)上面這段配置的意思很簡(jiǎn)單,設(shè)置元空間的初始值和最大值,設(shè)置堆空間的初始值和最大值。

為什么MetaspaceSize要設(shè)置為128M?為什么堆內(nèi)存初始值Xms設(shè)置為256M而不是512M?

按照J(rèn)ava官方的指導(dǎo)

JDK1.8中JVM架構(gòu)調(diào)整、分析與調(diào)優(yōu)的示例分析

  • Java堆大小設(shè)置,Xms 和 Xmx設(shè)置為老年代存活對(duì)象的3-4倍,即FullGC之后的老年代內(nèi)存占用的3-4倍
    永久代 PermSize和MaxPermSize(元空間)設(shè)置為老年代存活對(duì)象的1.2-1.5倍。
    年輕代Xmn的設(shè)置為老年代存活對(duì)象的1-1.5倍。
    老年代的內(nèi)存大小設(shè)置為老年代存活對(duì)象的2-3倍。

可以讓系統(tǒng)運(yùn)行一段時(shí)間后查看系統(tǒng)的各個(gè)指標(biāo),然后在進(jìn)行配置。如下用jstat工具查看jvm的情況

jstat -gc 12345
###
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
13824.0 22528.0 13377.0  0.0   548864.0 535257.2  113152.0   46189.3   73984.0 71119.8 9728.0 9196.2     14    0.259   3      0.287    0.546

OU表示老年代所占用的內(nèi)存為 46189.3 K(大約45M);那么jvm相應(yīng)的配置參數(shù)應(yīng)該做如下修改 

-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -Xms180m -Xmx180m

看完了這篇文章,相信你對(duì)“JDK1.8中JVM架構(gòu)調(diào)整、分析與調(diào)優(yōu)的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

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

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

AI