jvm7和8基本區別

jason47發表於2024-03-12

來自https://blog.csdn.net/weixin_43767015/article/details/105189239

1 對比圖

2 方法區的變化
JDK1.8與JDK1.7最大的區別是:JDK1.8將永久代取消,取而代之的是元空間,在JDK1.8中方法區是由元空間來實現,所以原來屬於方法區的執行時常量池就屬於元空間了。

元空間屬於本地記憶體,所以元空間的大小僅受本地記憶體限制,但是可以透過-XX:MaxMetaspaceSize進行增長上限的最大值設定,預設值為4G,元空間的初始空間大小可以透過-XX:MetaspaceSize進行設定,預設值為20.8M,還有一些其他引數可以進行設定,元空間大小會自動進行調整。

3 資料的遷移
在JDK1.7之前執行時常量池,字串常量池,靜態域等存放在方法區, 執行時常量池邏輯包含字串常量池,此時hotspot虛擬機器對方法區的實現為永久代。

在JDK1.7中字串常量池和靜態域被從方法區(永久代)拿到了堆中(在堆中另開闢了一塊空間),這裡沒有提到執行時常量池,也就是說字串常量池被單獨拿到堆,執行時常量池剩下的東西還在方法區,也就是hotspot中的永久代。

在JDK1.8 hotspot移除了永久代,用元空間(Metaspace)取而代之, 這時候字串常量池還在堆,執行時常量池還在方法區,只不過方法區的實現從永久代變成了元空間(Metaspace)。

4 元空間簡介
用於儲存已被虛擬機器載入的類後設資料,符號引用,即包括執行時常量池。元空間的本質和永久代類似,都是對JVM規範中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機器中,而是使用本地記憶體。因此,預設情況下,元空間的大小僅受本地記憶體限制,但可以透過以下引數來指定元空間的大小:-XX:MetaspaceSize。

4.1 後設資料
後設資料(Meta Date),關於資料的資料或者叫做用來描述資料的資料或者叫做資訊的資訊。

這些定義都很是抽象,我們可以把後設資料簡單的理解成,最小的資料單位。後設資料可以為資料說明其元素或屬性(名稱、大小、資料型別、等),或其結構(長度、欄位、資料列),或其相關資料(位於何處、如何聯絡、擁有者)

4.2 為什麼移除永久代?
由於永久代使用jvm記憶體經常不夠用或發生記憶體洩露,引發惱人的OutOfMemoryError異常(在Java Web開發中非常常見)。
移除永久代可以促進HotSpot JVM與JRockit VM兩種虛擬機器的融合,因為JRockit沒有永久代。
對永久代進行調優是很困難的。永久代中的後設資料可能會隨著每一次Full GC發生而進行移動。
4.3 為什麼要引入元空間
字串常量存在永久代中,容易出現效能問題和記憶體溢位。
類及方法的資訊等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢位,太大則容易導致老年代溢位。
永久代會為 GC 帶來不必要的複雜度,並且回收效率偏低。
Oracle 可能會將HotSpot與Jrockit兩種虛擬機器合二為一。

相關文章