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

JDK為什么廢棄永久代,而引入元空間

開發 前端
在原來的永久代劃分中,永久代用來存放類的元數據信息、靜態變量以及常量池等。現在類的元信息存儲在元空間中,靜態變量和常量池等并入堆中,相當于原來的永久代中的數據,被元空間和堆內存給瓜分了。

今天我們來說說這個 JVM 的相關知識,因為面試簡直是問到麻木的問題,那就是關于 JVM 的相關知識,今天了不起再次來和大家聊一下這個知識,我們從一些比較奇怪的問題說起,也不說那些經常會問到的內容了,比如 JVM 的垃圾回收機制什么的。

JDK 的元空間

我們都知道,在 JVM 中,,JVM 內存共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。

他們的作用,了不起給大家整了個圖解。

圖片圖片

這就是 JVM 中不同模塊對應的不同的作用。

那么什么是永久代,什么是元空間呢?

永久代:

在jdk7以及jdk7之前,方法區被稱為永久代(PermGen)

此時永久代是 Java 堆(Java Heap)的一部分,用于存儲類信息、方法信息、常量池信息等靜態數據。

元空間(Metaspace)

元空間不再與堆連續,而是直接存在于本地內存中,也就是機器的內存。理論上機器內存有多大,元空間的野心就有多大。

而在JDK1.7之前,HotSpot 虛擬機把方法區當成永久代來進行垃圾回收。而從 JDK 1.8 開始,移除永久代,并把方法區移至元空間,它位于本地內存中,而不是虛擬機內存中。

在Java7時,仍然有永久代,永久代也與堆中的老年代連續,但永久代中存儲的部分數據已經開始轉移到Java Heap或Native Memory中了,比如:

  • 符號引用(Symbols)轉移到了Native Memory
  • 字符串常量池(interned strings)轉移到了Java Heap
  • 類的靜態變量(class statics)轉移到了Java Heap

HotSpots取消了永久代,那么是不是也就沒有方法區了呢?

當然不是,方法區是一個規范,規范沒變,它就一直在,只不過取代永久代的是元空間(Metaspace)而已。

那么它和永久代有什么不同呢?這就是個問題了。

那么他們的不同點都有哪些呢?

元空間和永久代的不同點:

存儲位置不同

為什么說存儲位置不同呢?

永久代在物理上是堆的一部分,和新生代、老年代的地址是連續的,而元空間屬于本地內存。

存儲內容不同

在原來的永久代劃分中,永久代用來存放類的元數據信息、靜態變量以及常量池等。現在類的元信息存儲在元空間中,靜態變量和常量池等并入堆中,相當于原來的永久代中的數據,被元空間和堆內存給瓜分了。

圖片圖片

為什么要廢棄永久代,而使用元空間來進行替換呢?

這時候我們就有了新的問題,為什么要廢棄永久代,而使用元空間來進行替換呢?

首先我們得知道,在原來的永久代劃分中,永久代需要存放類的元數據、靜態變量和常量等。

它的大小不容易確定,因為這其中有很多影響因素,比如類的總數,常量池的大小和方法數量等。

-XX:MaxPermSize 指定太小很容易造成永久代內存溢出。

第二個原因則是移除永久代是為融合HotSpot VM與 JRockit VM而做出的努力,因為JRockit沒有永久代,不需要配置永久代。

第三個原因永久代會為GC帶來不必要的復雜度,并且回收效率偏低。

其實還有的人覺得,Oracle收購了jrockit虛擬機,要將它和HotSpot做整合,而jrockit是沒有永久代的而且jrockit用戶也沒有配置永久代大小的習慣所以將廢棄永久代與jrockit保持一致采用元空間實現方法區。了不起覺得也有一定的道理。

畢竟兩大虛擬機要做統一永久代和元空間勢必要廢棄一個,而永久代的痛點是在于大小不好設置,設置小了會頻繁發生GC,而且永久代的GC是效率很低且費時間,因為判斷一個類是否可以被回收的條件很苛刻且費時,會占用資源影響用戶線程的執行導致整體吞吐量變低。

而實際上永久代不是本地內存是虛擬機內存也就是是屬于JVM進程的內存,所以如果設置過大就回造成內存的浪費,空余部分內存JVM進程本身用不到也不讓其他進程使用。

如果使用元空間的話直接使用的是本地內存,默認也是不加以控制最大值的可以自己擴張,這樣可以減少GC提升吞吐量,再有哪怕設置了最大值由于使用的是直接內存,空余的內存也是允許其他進程使用的。

所以,大家知道為什么要替換了吧。

既然都已經要替換,那么一定是廢除永久代是對 JVM 來說,肯定是好處多多的。

廢除永久代的好處

  • 由于類的元數據分配在本地內存中,元空間的最大可分配空間就是系統可用內存空間。不會遇到永久代存在時的內存溢出錯誤。
  • 將運行時常量池從PermGen分離出來,與類的元數據分開,提升類元數據的獨立性。
  • 將元數據從PermGen剝離出來到Metaspace,可以提升對元數據的管理同時提升GC效率。

既然我們在這里說到這個Metaspace,那么肯定得說說這個 Metaspace 的相關參數都是代表的什么配置。

Metaspace

  • -XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那么在不超過MaxMetaspaceSize時,適當提高該值。
  • -XX:MaxMetaspaceSize,最大空間,默認是沒有限制的。如果沒有使用該參數來設置類的元數據的大小,其最大可利用空間是整個系統內存的可用空間。JVM也可以增加本地內存空間來滿足類元數據信息的存儲。但是如果沒有設置最大值,則可能存在bug導致Metaspace的空間在不停的擴展,會導致機器的內存不足;進而可能出現swap內存被耗盡;最終導致進程直接被系統直接kill掉。 如果設置了該參數,當Metaspace剩余空間不足,會拋出:java.lang.OutOfMemoryError: Metaspace space
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空間容量的百分比,減少為分配空間所導致的垃圾收集
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空間容量的百分比,減少為釋放空間所導致的垃圾收集
責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-02-13 15:03:33

JDKJavaHotSpot

2023-06-08 08:04:37

Java8元空間永久代

2019-10-23 08:16:50

Java8JVM內存

2017-09-28 08:37:17

數據中心空間下降

2022-01-17 22:09:50

JVM方法區數據

2024-04-03 13:49:00

Java虛擬機方法區

2022-06-01 16:13:51

元宇宙

2013-03-25 10:14:18

NginxApache

2019-04-19 11:56:48

框架AI開發

2022-02-10 20:26:06

虛擬元宇宙網絡

2022-02-18 00:15:58

Linux指令CPU

2019-12-27 14:47:06

Python編程語言

2012-10-10 16:52:21

CentOSDebianUbuntu

2021-10-30 19:57:00

HTTP2 HTTP

2021-08-14 09:04:58

TypeScriptJavaScript開發

2023-07-31 07:45:12

Spring項目Jakarta

2023-05-17 08:20:34

Java 17編程語言

2022-02-22 22:44:46

接口源碼對象

2017-09-11 19:58:06

PostgreSQLMySQL數據庫

2023-10-08 08:36:03

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产区 | 亚洲精品视频网站在线观看 | 91超碰在线观看 | 久久精品一区二区三区四区 | 久久亚洲天堂 | 色www精品视频在线观看 | 91免费观看 | 亚洲444eee在线观看 | 91av在线免费播放 | a视频在线 | 色婷婷国产精品综合在线观看 | 亚州av | 色婷婷精品久久二区二区蜜臂av | 免费在线精品视频 | www.精品一区 | 亚洲第一网站 | aaaa日韩 | 国产在线高清 | 天堂av在线影院 | 欧美 日韩 亚洲91麻豆精品 | 国产精品久久影院 | 黄色大片免费网站 | 日韩在线 | 国产精品免费看 | 精品欧美一区二区三区久久久 | 欧美日韩久久精品 | 亚洲一区二区三区四区五区午夜 | 久久精品国产一区二区电影 | 国产精品美女久久久久久久久久久 | 日韩av一区二区在线观看 | 春色av| 欧美国产中文 | 亚洲天堂中文字幕 | 精品成人佐山爱一区二区 | www在线| 日韩精品成人 | 国产精品一区二区av | 日韩在线精品视频 | 日韩毛片 | 在线午夜 | 国产精品久久久久久52avav |