成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么用元空間替代永久代?

開發 前端
JDK 1.8 及以后:無永久代,使用元空間(存放在本地內存中)實現方法區,常量保存在元空間,但字符串常量池和靜態變量依然保存在堆中。

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

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

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

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:上面的那段描述好像說的已經很清楚了,但又好像什么也沒說。這就好比,我問你“為什么要買車?”,你說“別人都買車了,所以我要買車”,但為什么別人要買車?

2.背后的原因

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

2.1 降低 OOM

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

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

2.2 降低運維成本

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

3.方法區發展史

在 HotSpot 虛擬機中,方法區的實現經歷了以下 3 個階段:

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

總結

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

參考 & 鳴謝

openjdk.org/jeps/122

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-09-28 07:34:23

JDK廢棄永久代元空間

2023-06-08 08:04:37

Java8元空間永久代

2024-12-25 15:32:29

2019-10-23 08:16:50

Java8JVM內存

2021-12-30 19:36:48

GoDubboJava

2022-01-07 14:05:33

DubboGoJava

2012-04-06 10:35:30

SpringJavaHibernate

2021-08-10 18:54:48

射頻系統SMA

2022-07-13 07:06:47

HTTPSHTTP協議

2020-07-20 14:09:36

Python編程語言注釋符

2023-10-10 08:24:12

2022-06-26 00:24:57

C語言操作系統語言

2009-07-07 17:18:57

Facelets介紹JSP與Facelet

2025-01-06 08:28:45

C語言操作系統程序

2020-12-25 09:07:38

EclipseCode工具

2025-06-03 06:00:00

margin-topCSS開發

2022-01-17 22:09:50

JVM方法區數據

2023-11-02 08:20:54

SocketZygoteAndroid

2023-01-28 13:39:31

Linuxzram

2022-06-01 16:13:51

元宇宙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜理伦三级理论三级在线观看 | 国产乱性| 欧美黄色精品 | 色爱av | 国产一区二区三区久久久久久久久 | 天堂资源 | 久久日韩粉嫩一区二区三区 | 久久久久久久久久久久91 | 国产目拍亚洲精品99久久精品 | 久久亚洲国产精品 | 久久久久久亚洲精品 | 精品一区二区久久久久久久网站 | 淫片一级国产 | 欧美中文字幕一区二区三区亚洲 | 日本精品免费在线观看 | 一级片成人 | 欧美日在线| 中文在线a在线 | 黄网站在线观看 | 一区二区三区在线观看免费视频 | 国产视频三区 | 久草热线 | 成人网av| 尤物在线 | 亚洲一一在线 | 日韩高清电影 | 一区二区在线 | 欧美在线色视频 | 欧美激情在线精品一区二区三区 | 亚洲精色| 日韩手机视频 | 欧美一区二区三区在线播放 | 成人性生交大免费 | av国产精品| 久久首页 | 亚洲在线视频 | www久久 | 成人免费网站www网站高清 | 一区二区在线观看av | 在线播放一区二区三区 | 特一级毛片|