JVM中永久代和元空間是什么意思

這篇文章主要介紹了JVM中永久代和元空間是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站制作等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都餐廳設(shè)計(jì)等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時也獲得了客戶的一致表揚(yáng)!

永久代

Java 的內(nèi)存中有一塊稱之為方法區(qū)的部分,在 JDK8 之前, Hotspot 虛擬機(jī)中的實(shí)現(xiàn)方式為永久代(Permanent Generation),別的JVM都沒有這個東西。

在過去(當(dāng)自定義類加載器使用不普遍的時候),類幾乎是“靜態(tài)的”并且很少被卸載和回收,因此類也可以被看成“永久的”。另外由于類作為 JVM 實(shí)現(xiàn)的一部分,它們不由程序來創(chuàng)建,因?yàn)樗鼈円脖徽J(rèn)為是“非堆”的內(nèi)存。

永久代是一段連續(xù)的內(nèi)存空間,我們在 JVM 啟動之前可以通過設(shè)置-XX:MaxPermSize的值來控制永久代的大小,32 位機(jī)器默認(rèn)的永久代的大小為 64M,64 位的機(jī)器則為 85M。

永久代的垃圾回收和老年代的垃圾回收是綁定的,一旦其中一個區(qū)域被占滿,這兩個區(qū)都要進(jìn)行垃圾回收。但是有一個明顯的問題,由于我們可以通過?XX:MaxPermSize設(shè)置永久代的大小,一旦類的元數(shù)據(jù)超過了設(shè)定的大小,程序就會耗盡內(nèi)存,并出現(xiàn)內(nèi)存溢出錯誤 (java.lang.OutOfMemoryError: PermGen space)。

為什么類的元數(shù)據(jù)占用內(nèi)存會那么大?因?yàn)樵?JDK7 之前的 HotSpot 虛擬機(jī)中,納入字符串常量池的字符串被存儲在永久代中,因此導(dǎo)致了一系列的性能問題和內(nèi)存溢出錯誤。

為了解決這些性能問題,也為了能夠讓 Hotspot 能和其他的虛擬機(jī)一樣管理,元空間就產(chǎn)生了。

元空間

元空間是 Hotspot 在 JDK8 中新加的內(nèi)容,其本質(zhì)和永久代類似,都是對 JVM 規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:

元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。因此,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制,但可以通過以下參數(shù)來指定元空間的大小:

-XX:MetaspaceSize 

初始空間大小,達(dá)到該值就會觸發(fā)垃圾收集進(jìn)行類型卸載,同時GC會對該值進(jìn)行調(diào)整:如果釋放了大量的空間,就適當(dāng)降低該值;如果釋放了很少的空間,那么在不超過MaxMetaspaceSize時,適當(dāng)提高該值?! ?-XX:MaxMetaspaceSize 最大空間,默認(rèn)是沒有限制的。

除了上面兩個指定大小的選項(xiàng)以外,還有兩個與 GC 相關(guān)的屬性:

-XX:MinMetaspaceFreeRatio

在GC之后,最小的Metaspace剩余空間容量的百分比,減少為分配空間所導(dǎo)致的垃圾收集

-XX:MaxMetaspaceFreeRatio

在GC之后,最大的Metaspace剩余空間容量的百分比,減少為釋放空間所導(dǎo)致的垃圾收集

移除永久代的影響

由于類的元數(shù)據(jù)分配在本地內(nèi)存中,元空間的最大可分配空間就是系統(tǒng)可用內(nèi)存空間。因此,我們就不會遇到永久代存在時的內(nèi)存溢出錯誤,也不會出現(xiàn)泄漏的數(shù)據(jù)移到交換區(qū)這樣的事情。最終用戶可以為元空間設(shè)置一個可用空間最大值,如果不進(jìn)行設(shè)置,JVM 會自動根據(jù)類的元數(shù)據(jù)大小動態(tài)增加元空間的容量。

注意:永久代的移除并不代表自定義的類加載器泄露問題就解決了。因此,你還必須監(jiān)控你的內(nèi)存消耗情況,因?yàn)橐坏┌l(fā)生泄漏,會占用你的大量本地內(nèi)存,并且還可能導(dǎo)致交換區(qū)交換更加糟糕。

元空間內(nèi)存管理

元空間的內(nèi)存管理由元空間虛擬機(jī)來完成。

先前,對于類的元數(shù)據(jù)我們需要不同的垃圾回收器進(jìn)行處理,現(xiàn)在只需要執(zhí)行元空間虛擬機(jī)的 C++ 代碼即可完成。在元空間中,類和其元數(shù)據(jù)的生命周期和其對應(yīng)的類加載器是相同的。話句話說,只要類加載器存活,其加載的類的元數(shù)據(jù)也是存活的,因而不會被回收掉。

準(zhǔn)確的來說,每一個類加載器的存儲區(qū)域都稱作一個元空間,所有的元空間合在一起就是我們一直說的元空間。當(dāng)一個類加載器被垃圾回收器標(biāo)記為不再存活,其對應(yīng)的元空間會被回收。在元空間的回收過程中沒有重定位和壓縮等操作。但是元空間內(nèi)的元數(shù)據(jù)會進(jìn)行掃描來確定 Java 引用。

那具體是如何管理的呢?

元空間虛擬機(jī)負(fù)責(zé)元空間的分配,其采用的形式為組塊分配。組塊的大小因類加載器的類型而異。在元空間虛擬機(jī)中存在一個全局的空閑組塊列表。

  1. 當(dāng)一個類加載器需要組塊時,它就會從這個全局的組塊列表中獲取并維持一個自己的組塊列表。

  2. 當(dāng)一個類加載器不再存活時,那么其持有的組塊將會被釋放,并返回給全局組塊列表。

  3. 類加載器持有的組塊又會被分成多個塊,每一個塊存儲一個單元的元信息。組塊中的塊是線性分配(指針碰撞分配形式)。組塊分配自內(nèi)存映射區(qū)域。這些全局的虛擬內(nèi)存映射區(qū)域以鏈表形式連接,一旦某個虛擬內(nèi)存映射區(qū)域清空,這部分內(nèi)存就會返回給操作系統(tǒng)。

運(yùn)行時常量池

運(yùn)行時常量池在 JDK6 及之前版本的 JVM 中是方法區(qū)的一部分,而在 HotSpot 虛擬機(jī)中方法區(qū)的實(shí)現(xiàn)是永久代(Permanent Generation)。所以運(yùn)行時常量池也是在永久代的。

但是 JDK7 及之后版本的 JVM 已經(jīng)將字符串常量池從方法區(qū)中移了出來,在堆(Heap)中開辟了一塊區(qū)域存放運(yùn)行時常量池。

String.intern()是一個 Native 方法,它的作用是:如果運(yùn)行時常量池中已經(jīng)包含一個等于此 String 對象內(nèi)容的字符串,則返回常量池中該字符串的引用;如果沒有,則在常量池中創(chuàng)建與此 String 內(nèi)容相同的字符串,并返回常量池中創(chuàng)建的字符串的引用。

存在的問題

前面已經(jīng)提到,元空間虛擬機(jī)采用了組塊分配的形式,同時區(qū)塊的大小由類加載器類型決定。類信息并不是固定大小,因此有可能分配的空閑區(qū)塊和類需要的區(qū)塊大小不同,這種情況下可能導(dǎo)致碎片存在。元空間虛擬機(jī)目前并不支持壓縮操作,所以碎片化是目前最大的問題。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JVM中永久代和元空間是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

標(biāo)題名稱:JVM中永久代和元空間是什么意思
當(dāng)前URL:http://muchs.cn/article44/gecpee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、定制開發(fā)、營銷型網(wǎng)站建設(shè)、定制網(wǎng)站、App開發(fā)、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)