1 對比圖
2 方法區(qū)的變化
JDK1.8 與JDK1.7 最大的區(qū)別是:JDK1.8 將永久代取消,取而代之的是元空間荣回,在 JDK1.8 中方法區(qū)是由元空間來實現遭贸,所以原來屬于方法區(qū)的運行時常量池就屬于元空間了。
??元空間屬于本地內存驹马,所以元空間的大小僅受本地內存限制革砸,但是可以通過 -XX:MaxMetaspaceSize
進行增長上限的最大值設置,默認值為 4G糯累,元空間的初始空間大小可以通過 -XX:MetaspaceSize
進行設置算利,默認值為 20.8M,還有一些其他參數可以進行設置泳姐,元空間大小會自動進行調整效拭。
3 數據的遷移
- 在 JDK1.7 之前運行時常量池,字符串常量池胖秒,靜態(tài)域等存放在方法區(qū), 運行時常量池邏輯包含字符串常量池缎患,此時hotspot虛擬機對方法區(qū)的實現為永久代。
- 在 JDK1.7 中字符串常量池和靜態(tài)域被從方法區(qū)(永久代)拿到了堆中(在堆中另開辟了一塊空間)阎肝,這里沒有提到運行時常量池,也就是說字符串常量池被單獨拿到堆,運行時常量池剩下的東西還在方法區(qū),也就是 HotSpot 中的永久代挤渔。
- 在 JDK1.8 中 HotSpot 移除了永久代,用元空間(Metaspace)取而代之, 這時候字符串常量池還在堆,運行時常量池還在方法區(qū),只不過方法區(qū)的實現從永久代變成了元空間(Metaspace)风题。
4 元空間簡介
用于存儲已被虛擬機加載的類元數據判导,符號引用嫉父,即包括運行時常量池。元空間的本質和永久代類似眼刃,都是對 JVM 規(guī)范中方法區(qū)的實現绕辖。
不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機中,而是使用本地內存擂红。因此仪际,默認情況下,元空間的大小僅受本地內存限制昵骤,但可以通過以下參數來指定元空間的大惺骷睢:-XX:MetaspaceSize
。
4.1 元數據
元數據(Meta Data)变秦,關于數據的數據或者叫做用來描述數據的數據或者叫做信息的信息赴恨。
??這些定義都很是抽象,我們可以把元數據簡單的理解成伴栓,最小的數據單位。元數據可以為數據說明其元素雨饺、屬性(名稱钳垮、大小、數據類型额港、等)饺窿,、結構(長度移斩、字段肚医、數據列)、相關數據(位于何處向瓷、如何聯系肠套、擁有者)等。
4.2 為什么移除永久代猖任?
- 由于永久代使用 JVM 內存經常不夠用或發(fā)生內存泄露你稚,引發(fā)惱人的 OutOfMemoryError 異常(在 Java Web 開發(fā)中非常常見)。
- 移除永久代可以促進 HotSpot 與 JRockit 兩種虛擬機的融合朱躺,因為 JRockit 沒有永久代刁赖。
- 對永久代進行調優(yōu)是很困難的。永久代中的元數據可能會隨著每一次Full GC發(fā)生而進行移動长搀。
4.3 為什么要引入元空間宇弛?
- 字符串常量存在永久代中,容易出現性能問題和內存溢出源请。
- 類及方法的信息等比較難確定其大小枪芒,因此對于永久代的大小指定比較困難彻况,太小容易出現永久代溢出,太大則容易導致老年代溢出病苗。
- 永久代會為 GC 帶來不必要的復雜度疗垛,并且回收效率偏低。
- Oracle 可能會將HotSpot與Jrockit兩種虛擬機合二為一硫朦。