日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java8JVM內(nèi)存結(jié)構(gòu)變了,永久代到元空間

java8 JVM內(nèi)存結(jié)構(gòu)變了,永久代到元空間

作者:IT技術(shù)分享 2019-10-23 08:16:50

云計(jì)算

虛擬化 如果在網(wǎng)絡(luò)上搜索JVM內(nèi)存結(jié)構(gòu),90%的可能會(huì)搜到Java7及以前的內(nèi)存圖,本篇文章將會(huì)對(duì)JVM內(nèi)存結(jié)構(gòu)再次細(xì)化,深入理解Java8之后的內(nèi)部變化。

創(chuàng)新互聯(lián)主營(yíng)建甌網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開(kāi)發(fā),建甌h5微信小程序開(kāi)發(fā)搭建,建甌網(wǎng)站營(yíng)銷(xiāo)推廣歡迎建甌等地區(qū)企業(yè)咨詢(xún)

 如果在網(wǎng)絡(luò)上搜索JVM內(nèi)存結(jié)構(gòu),90%的可能會(huì)搜到Java7及以前的內(nèi)存圖,本篇文章將會(huì)對(duì)JVM內(nèi)存結(jié)構(gòu)再次細(xì)化,深入理解Java8之后的內(nèi)部變化。

[[279939]]

再來(lái)看一下《 JVM之內(nèi)存結(jié)構(gòu)詳解 》中的內(nèi)存結(jié)構(gòu)圖。

為了更細(xì)化的講解,我們將該圖進(jìn)行進(jìn)一步的優(yōu)化調(diào)整。針對(duì)java7及以前版本的細(xì)化。

看出變化了嗎?堆和方法區(qū)連在了一起,但這并不能說(shuō)堆和方法區(qū)是一起的,它們?cè)谶壿嬌弦琅f是分開(kāi)的。但在物理上來(lái)說(shuō),它們又是連續(xù)的一塊內(nèi)存。也就是說(shuō),方法區(qū)和前面講到的Eden和老年代是連續(xù)的。

在繼續(xù)進(jìn)行下去之前,我們先來(lái)理解兩個(gè)概念:規(guī)范和實(shí)現(xiàn)。

規(guī)范和實(shí)現(xiàn)

針對(duì)Java虛擬機(jī)的實(shí)現(xiàn)有專(zhuān)門(mén)的《Java虛擬機(jī)規(guī)范》,在遵守規(guī)范的前提下,不同的廠商會(huì)對(duì)虛擬機(jī)進(jìn)行不同的實(shí)現(xiàn)。 就好比開(kāi)發(fā)的過(guò)程中定義了接口,具體的接口實(shí)現(xiàn)大家可以根據(jù)不同的業(yè)務(wù)需求進(jìn)行實(shí)現(xiàn)。

我們通常使用的Java SE都是由Sun JDK和OpenJDK所提供,這也是應(yīng)用最廣泛的版本。而該版本使用的VM就是HotSpot VM。通常情況下,我們所講的java虛擬機(jī)指的就是HotSpot的版本。

永久代(PermGen)

上面理解了規(guī)范和實(shí)現(xiàn)之后,來(lái)看認(rèn)識(shí)一個(gè)概念“永久代(Permanet Generation,也稱(chēng)PermGen)”。對(duì)于習(xí)慣了在HotSpot虛擬機(jī)上開(kāi)發(fā)、部署的程序員來(lái)說(shuō),很多都愿意將方法區(qū)稱(chēng)作永久代。

本質(zhì)上來(lái)講兩者并不等價(jià),僅因?yàn)镠otspot將GC分代擴(kuò)展至方法區(qū),或者說(shuō)使用永久代來(lái)實(shí)現(xiàn)方法區(qū)。在其他虛擬機(jī)上是沒(méi)有永久代的概念的。也就是說(shuō)方法區(qū)是規(guī)范,永久代是Hotspot針對(duì)該規(guī)范進(jìn)行的實(shí)現(xiàn)。

理解上面的概念之后,我們對(duì)Java7及以前版本的堆和方法區(qū)的構(gòu)造再進(jìn)行一下變動(dòng)。

再重復(fù)一遍就是對(duì)Java7及以前版本的Hotspot中方法區(qū)位于永久代中。同時(shí),永久代和堆是相互隔離的,但它們使用的物理內(nèi)存是連續(xù)的。

永久代的垃圾收集是和老年代捆綁在一起的,因此無(wú)論誰(shuí)滿了,都會(huì)觸發(fā)永久代和老年代的垃圾收集。

但在Java7中永久代中存儲(chǔ)的部分?jǐn)?shù)據(jù)已經(jīng)開(kāi)始轉(zhuǎn)移到Java Heap或Native Memory中了。比如,符號(hào)引用(Symbols)轉(zhuǎn)移到了Native Memory;字符串常量池(interned strings)轉(zhuǎn)移到了Java Heap;類(lèi)的靜態(tài)變量(class statics)轉(zhuǎn)移到了Java Heap。

然后,在Java8中,時(shí)代變了,Hotspot取消了永久代。永久代真的成了永久的記憶。永久代的參數(shù)-XX:PermSize和-XX:MaxPermSize也隨之失效。

元空間(Metaspace)

對(duì)于Java8,HotSpots取消了永久代,那么是不是就沒(méi)有方法區(qū)了呢?當(dāng)然不是,方法區(qū)只是一個(gè)規(guī)范,只不過(guò)它的實(shí)現(xiàn)變了。

在Java8中,元空間(Metaspace)登上舞臺(tái),方法區(qū)存在于元空間(Metaspace)。同時(shí),元空間不再與堆連續(xù),而且是存在于本地內(nèi)存(Native memory)。

本地內(nèi)存(Native memory),也稱(chēng)為C-Heap,是供JVM自身進(jìn)程使用的。當(dāng)Java Heap空間不足時(shí)會(huì)觸發(fā)GC,但Native memory空間不夠卻不會(huì)觸發(fā)GC。

針對(duì)Java8的調(diào)整,我們?cè)俅螌?duì)內(nèi)存結(jié)構(gòu)圖進(jìn)行調(diào)整。

 

 

元空間存在于本地內(nèi)存,意味著只要本地內(nèi)存足夠,它不會(huì)出現(xiàn)像永久代中“java.lang.OutOfMemoryError: PermGen space”這種錯(cuò)誤??瓷蠄D中的方法區(qū),是不是“膨脹”了。

默認(rèn)情況下元空間是可以無(wú)限使用本地內(nèi)存的,但為了不讓它如此膨脹,JVM同樣提供了參數(shù)來(lái)限制它使用的使用。

  • -XX:MetaspaceSize,class metadata的初始空間配額,以bytes為單位,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)行類(lèi)型卸載,同時(shí)GC會(huì)對(duì)該值進(jìn)行調(diào)整:如果釋放了大量的空間,就適當(dāng)?shù)慕档驮撝?如果釋放了很少的空間,那么在不超過(guò)MaxMetaspaceSize(如果設(shè)置了的話),適當(dāng)?shù)奶岣咴撝怠?/li>
  • -XX:MaxMetaspaceSize,可以為class metadata分配的最大空間。默認(rèn)是沒(méi)有限制的。
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空間容量的百分比,減少為class metadata分配空間導(dǎo)致的垃圾收集。
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空間容量的百分比,減少為class metadata釋放空間導(dǎo)致的垃圾收集。

永久代為什么被替換了

思考一下,為什么使用元空間替換永久代?

表面上看是為了避免OOM異常。因?yàn)橥ǔJ褂肞ermSize和MaxPermSize設(shè)置永久代的大小就決定了永久代的上限,但是不是總能知道應(yīng)該設(shè)置為多大合適, 如果使用默認(rèn)值很容易遇到OOM錯(cuò)誤。

當(dāng)使用元空間時(shí),可以加載多少類(lèi)的元數(shù)據(jù)就不再由MaxPermSize控制, 而由系統(tǒng)的實(shí)際可用空間來(lái)控制。

 

更深層的原因還是要合并HotSpot和JRockit的代碼,JRockit從來(lái)沒(méi)有所謂的永久代,也不需要開(kāi)發(fā)運(yùn)維人員設(shè)置永久代的大小,但是運(yùn)行良好。同時(shí)也不用擔(dān)心運(yùn)行性能問(wèn)題了,在覆蓋到的測(cè)試中, 程序啟動(dòng)和運(yùn)行速度降低不超過(guò)1%,但是這點(diǎn)性能損失換來(lái)了更大的安全保障。

 


本文標(biāo)題:Java8JVM內(nèi)存結(jié)構(gòu)變了,永久代到元空間
文章鏈接:http://www.5511xx.com/article/dhpjcso.html