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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為什么用元空間替代永久代?

永久代和元空間都是 HotSpot 虛擬機中的概念,HotSpot 虛擬機是 Sun JDK 和 Open JDK 中自帶的虛擬機,也是目前使用范圍最廣泛的 Java 虛擬機,當我們提到虛擬機時,大概率指的就是 HotSpot 虛擬機。

但從《Java 虛擬機規(guī)范》的層面來說,并沒有所謂的“永久代”和“元空間”等區(qū)域,詳見官方文檔:https://docs.oracle.com/javase/specs/jvms/se17/html/jvms-2.html#jvms-2.5?!禞ava 虛擬機規(guī)范》只是規(guī)定了一個區(qū)域叫“方法區(qū)(Method Area)”,而“永久代”和“元空間”是 HotSpot 虛擬機在不同的 JDK 版本下,對方法區(qū)的具體實現(xiàn)而已。這就好像,世界羽協(xié)規(guī)定羽毛球比賽必須要使用羽毛球拍(方法區(qū)),而中國羽毛球運動員,第一年使用的是紅雙喜牌的羽毛球拍(永久代),第二年使用的是李寧牌羽毛球拍(元空間)一樣。

那么問題來了,永久代為什么被元空間給替代了?

1.官方答案

關于這個問題,官方在 JEP 122: Remove the Permanent Generation(移除永久代)中給出了答案,原文內容如下:

Motivation(動機)

This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.

以上內容翻譯成中文大意是:

這是 JRockit 虛擬機和 HotSpot 虛擬機融合工作的一部分。JRockit 客戶不需要配置永久層代(因為 JRockit 沒有永久代),所以要移除永久代。

JRockit 是 Java 官方收購的一家號稱史上運行最快的 Java 虛擬機廠商,之后 Java 官方在 JDK 8 時將 JRockit 虛擬機和 HotSpot 虛擬機進行了整合。

PS:JEP 是 JDK Enhancement Proposal 的縮寫,翻譯成中文是 JDK 改進提案。你也可以把它理解為 JDK 的更新文檔。

通過官方的描述,我們似乎找到了答案,也就是說,之所以要取消“永久代”是因為 Java 官方收購了 JRockit,之后在將 JRockit 和 HotSpot 進行整合時,因為 JRockit 中沒有“永久代”,所以把永久代給移除了。

PS:上面的那段描述好像說的已經(jīng)很清楚了,但又好像什么也沒說。這就好比,我問你“為什么要買車?”,你說“別人都買車了,所以我要買車”,但為什么別人要買車?

2.背后的原因

上述給出了移除永久代的回答,但卻沒有給出背后的原因,那接下來我們就來討論一下,為什么要移除永久代?以及為什么要有元空間?

2.1 降低 OOM

當使用永久代實現(xiàn)方法區(qū)時,永久代的最大容量受制于 PermSize 和 MaxPermSize 參數(shù)設置的大小,而這兩個參數(shù)的大小又很難確定,因為在程序運行時需要加載多少類是很難估算的,如果這兩個參數(shù)設置的過小就會頻繁的觸發(fā) FullGC 和導致 OOM(Out of Memory,內存溢出)。

但是,當使用元空間替代了永久代之后,出現(xiàn) OOM 的幾率就被大大降低了,因為元空間使用的是本地內存,這樣元空間的大小就只和本地內存的大小有關了,從而大大降低了 OOM 的問題。

2.2 降低運維成本

因為元空間使用的是本地內存,這樣就無需運維人員再去專門設置和調整元空間的大小了。

3.方法區(qū)發(fā)展史

在 HotSpot 虛擬機中,方法區(qū)的實現(xiàn)經(jīng)歷了以下 3 個階段:

  1. JDK 1.6 及之前:方法區(qū)使用永久代實現(xiàn),靜態(tài)變量存放在永久代;
  2. JDK 1.7 :“去永久代”的前置版本,還存在永久代,不過已經(jīng)將字符串常量池和靜態(tài)變量從永久代移到了堆上;
  3. JDK 1.8 及以后:無永久代,使用元空間(存放在本地內存中)實現(xiàn)方法區(qū),常量保存在元空間,但字符串常量池和靜態(tài)變量依然保存在堆中。

總結

永久代和元空間都是 HotSpot 虛擬機對《Java 虛擬機規(guī)范》中方法區(qū)的實現(xiàn),在 JDK 1.8 之前 HotSpot 是使用永久代來實現(xiàn)方法區(qū)的,但這樣會導致 JVM 調優(yōu)比較困難,且容易發(fā)生 OOM 的問題,而 JDK 1.8 及之后,使用的是元空間存放在本地內存中的方式來替代永久代的,這樣就降低了 OOM 發(fā)生的可能性,也是 JRockit 和 HotSpot 融合之后的改動之一。

參考 & 鳴謝

openjdk.org/jeps/122


網(wǎng)頁名稱:為什么用元空間替代永久代?
當前鏈接:http://m.5511xx.com/article/djppgdi.html