掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
JVM 的內(nèi)存模型主要包括程序計(jì)數(shù)器(Program Counter Register)、虛擬機(jī)棧(VM Stack)、本地方法棧(Native Method Stack)、堆(Heap)和方法區(qū)(Method Area)。

創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的肅寧網(wǎng)站建設(shè)公司,肅寧接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行肅寧網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
方法區(qū)(Method Area)是所有線程共享的內(nèi)存區(qū)域,用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
具體來(lái)說(shuō),方法區(qū)用來(lái)存儲(chǔ)以下數(shù)據(jù):
方法區(qū)只是 JVM 規(guī)范中定義的一個(gè)概念,針對(duì) Hotspot 虛擬機(jī),Java8 之前使用永久代(Permanent Generation,簡(jiǎn)稱(chēng) PermGen)實(shí)現(xiàn),而 Java8 之后使用元空間(Metaspace)實(shí)現(xiàn)。
JDK8 之前可以通過(guò) -XX:PermSize 和 -XX:MaxPermSize 來(lái)設(shè)置永久代大小,JDK8 之后,使用元空間替換了永久代,改為通過(guò) -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 來(lái)設(shè)置元空間大小。
永久代的空間是有限制的,可以通過(guò) -XX:PermSize 設(shè)置永久代初始容量,通過(guò)-XX:MaxPermSize 設(shè)置永久代最大容量。
但是當(dāng)加載過(guò)多的類(lèi)或者常量的時(shí)候,就可能導(dǎo)致永久代的空間不足,拋出 java.lang.OutOfMemoryError: PermGen space 異常。尤其是web應(yīng)用會(huì)使用很多框架,這些框架會(huì)動(dòng)態(tài)加載很多基礎(chǔ)類(lèi),更容易導(dǎo)致OOM。
永久代中的類(lèi)信息一般是在應(yīng)用程序運(yùn)行期間不會(huì)發(fā)生變化的,因此,如果開(kāi)啟了永久代的垃圾回收,就會(huì)造成大量的垃圾回收操作,導(dǎo)致垃圾回收效率低下,甚至?xí)饝?yīng)用程序的暫停。
此外,由于永久代主要存放 JVM 加載的類(lèi)信息等永久存在的數(shù)據(jù),這使得它在垃圾回收過(guò)程中的回收效率相對(duì)較低。在某些情況下,頻繁觸發(fā)的 Full GC 不僅無(wú)法有效回收永久代空間,還會(huì)嚴(yán)重影響 JVM 的性能。
永久代的大小一旦被設(shè)置,就無(wú)法動(dòng)態(tài)調(diào)整,如果預(yù)估錯(cuò)誤,就可能導(dǎo)致浪費(fèi)內(nèi)存或內(nèi)存不足的問(wèn)題。
在永久代中,常量池是一個(gè)非常重要的部分,但是其中的常量無(wú)法被回收,即使這些常量已經(jīng)不再被使用,也無(wú)法被垃圾回收器回收,這會(huì)浪費(fèi)內(nèi)存。
元空間(Metaspace)是 Java8 中引入的一個(gè)新概念,用來(lái)替代原來(lái)的永久代。與永久代不同,元空間并不在虛擬機(jī)中,而是存儲(chǔ)在本地內(nèi)存(Native Memory)。
從 Java7 已經(jīng)開(kāi)始逐步移除永久代,在Java7中把 interned Strings 、 class statics 和 String Pool 從永久代移到堆中。在 Java8 中徹底移除了永久代,把將類(lèi)的元數(shù)據(jù)信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼從永久代中移到了元空間中。
與永久代相比,使用元空間使用方法區(qū)具有以下優(yōu)點(diǎn):
盡管元空間解決了永久代的一些問(wèn)題,可能也同時(shí)引入了一些新問(wèn)題:
因此,雖然元空間為 JVM 的內(nèi)存管理帶來(lái)了新的可能,但也帶來(lái)了新的挑戰(zhàn)。為了充分利用元空間的優(yōu)勢(shì),開(kāi)發(fā)者需要理解其工作原理,掌握正確的使用和調(diào)優(yōu)方法。
Java8 選擇使用元空間(Metaspace)替代永久代(PermGen)是 JVM 內(nèi)存模型的一次重大改進(jìn)。解決了永久代面臨的空間限制、低效的垃圾回收、以及復(fù)雜的內(nèi)存管理等問(wèn)題。元空間利用本地內(nèi)存,能夠動(dòng)態(tài)調(diào)整大小,提供了更大的空間來(lái)存儲(chǔ)類(lèi)元數(shù)據(jù),也更好地適應(yīng)了大型、模塊化應(yīng)用的需求。
但是元空間也引入了一些新問(wèn)題。如何避免本地內(nèi)存溢出,如何制定有效的內(nèi)存管理和調(diào)優(yōu)策略,都是開(kāi)發(fā)者需要重新考慮的問(wèn)題。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流