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

JVM高階面試:Java8為什么使用元空間替換永久代?

開發 前端
元空間(Metaspace)是 Java8 中引入的一個新概念,用來替代原來的永久代。與永久代不同,元空間并不在虛擬機中,而是存儲在本地內存(Native Memory)。

1. 方法區簡介

JVM 的內存模型主要包括程序計數器(Program Counter Register)、虛擬機棧(VM Stack)、本地方法棧(Native Method Stack)、堆(Heap)和方法區(Method Area)。

方法區(Method Area)是所有線程共享的內存區域,用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

具體來說,方法區用來存儲以下數據:

  1. 類的元數據信息:包括類的名稱、訪問標志、父類、接口、字段、方法等信息。
  2. 運行時常量池:在Java代碼中,常量可以被直接定義在類或接口中,這些常量在編譯后被存儲在Class文件的常量池中,而運行時常量池則是從Class文件中加載的。
  3. 靜態變量和常量:類的靜態變量和常量都存儲在方法區中,它們在類加載的時候被初始化并分配內存空間。
  4. 方法字節碼:在Java中,方法的字節碼被編譯成Class文件并存儲在方法區中。
  5. 即時編譯器(JIT)編譯后的代碼:為了提高程序的執行效率,JIT會將熱點代碼編譯成本地機器碼并存儲在方法區中。

方法區只是 JVM 規范中定義的一個概念,針對 Hotspot 虛擬機,Java8 之前使用永久代(Permanent Generation,簡稱 PermGen)實現,而 Java8 之后使用元空間(Metaspace)實現。

JDK8 之前可以通過 -XX:PermSize 和 -XX:MaxPermSize 來設置永久代大小,JDK8 之后,使用元空間替換了永久代,改為通過 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 來設置元空間大小。

圖片

2. 永久代問題

2.1 內存溢出

永久代的空間是有限制的,可以通過 -XX:PermSize 設置永久代初始容量,通過-XX:MaxPermSize 設置永久代最大容量。

但是當加載過多的類或者常量的時候,就可能導致永久代的空間不足,拋出 java.lang.OutOfMemoryError: PermGen space 異常。尤其是web應用會使用很多框架,這些框架會動態加載很多基礎類,更容易導致OOM。

2.2 垃圾回收效率低下

永久代中的類信息一般是在應用程序運行期間不會發生變化的,因此,如果開啟了永久代的垃圾回收,就會造成大量的垃圾回收操作,導致垃圾回收效率低下,甚至會引起應用程序的暫停。

此外,由于永久代主要存放 JVM 加載的類信息等永久存在的數據,這使得它在垃圾回收過程中的回收效率相對較低。在某些情況下,頻繁觸發的 Full GC 不僅無法有效回收永久代空間,還會嚴重影響 JVM 的性能。

2.3 無法動態調整大小

永久代的大小一旦被設置,就無法動態調整,如果預估錯誤,就可能導致浪費內存或內存不足的問題。

2.4 無法回收常量池中的內存

在永久代中,常量池是一個非常重要的部分,但是其中的常量無法被回收,即使這些常量已經不再被使用,也無法被垃圾回收器回收,這會浪費內存。

3. 元空間簡介

元空間(Metaspace)是 Java8 中引入的一個新概念,用來替代原來的永久代。與永久代不同,元空間并不在虛擬機中,而是存儲在本地內存(Native Memory)。

從 Java7 已經開始逐步移除永久代,在Java7中把 interned Strings 、 class statics 和 String Pool 從永久代移到堆中。在 Java8 中徹底移除了永久代,把將類的元數據信息、常量、靜態變量、即時編譯器編譯后的代碼從永久代中移到了元空間中。

圖片

4. 元空間的優點

與永久代相比,使用元空間使用方法區具有以下優點:

  • 突破內存限制,減少OOM。 由于元空間使用的是本地內存,而不是 JVM 內存,因此理論上,其大小只受限于操作系統的實際可用內存。這大大減少了內存溢出的可能性。相較于永久代在 JVM 堆中預分配的有限空間,元空間的引入提供了更大的空間來存儲類元數據。
  • 提高 Full GC 的效率。 在永久代中,Full GC 的觸發比較頻繁,而且效率較低。因為永久代中存放了很多 JVM 需要的類信息,這些數據大多數是不會被清理的,所以 Full GC 往往無法回收多少空間。但在元空間模型中,由于字符串常量池已移至堆中,靜態變量也移至 Java 堆或者本地內存,因此可以更有效地進行垃圾回收,避免了因頻繁的 Full GC 導致的性能影響。
  • 滿足不同的類加載需求和動態類加載的情況。 在一些大型的、模塊化的應用中,可能需要加載大量的類,這就需要大量的元數據存儲空間。元空間可以動態地調整大小,能更好地滿足這種需求。
  • 避免永久代調優和大小設置的復雜性。 在 Java8 之前的版本中,通常需要手動設置永久代的大小,以避免內存溢出的錯誤。這增加了應用的配置和管理的復雜性。而元空間使用本地內存,根據實際需求動態調整,大大簡化了內存管理的復雜性。

5. 元空間問題

盡管元空間解決了永久代的一些問題,可能也同時引入了一些新問題:

  • 可能導致本地內存溢出:雖然元空間使用的是本地內存,理論上其大小只受限于操作系統的實際可用內存,但是如果元空間的使用不加以控制,可能會導致大量的本地內存被占用,從而導致 OutOfMemoryError。
  • 內存管理和調優策略:永久代的內存管理和調優策略無法直接應用到元空間,需要重新考慮和設計。例如,如何確定元空間的初始大小、最大大小,如何進行垃圾回收,等等。

因此,雖然元空間為 JVM 的內存管理帶來了新的可能,但也帶來了新的挑戰。為了充分利用元空間的優勢,開發者需要理解其工作原理,掌握正確的使用和調優方法。

6. 總結

Java8 選擇使用元空間(Metaspace)替代永久代(PermGen)是 JVM 內存模型的一次重大改進。解決了永久代面臨的空間限制、低效的垃圾回收、以及復雜的內存管理等問題。元空間利用本地內存,能夠動態調整大小,提供了更大的空間來存儲類元數據,也更好地適應了大型、模塊化應用的需求。

但是元空間也引入了一些新問題。如何避免本地內存溢出,如何制定有效的內存管理和調優策略,都是開發者需要重新考慮的問題。

責任編輯:武曉燕 來源: 一燈架構
相關推薦

2019-10-23 08:16:50

Java8JVM內存

2023-02-13 15:03:33

JDKJavaHotSpot

2023-09-28 07:34:23

JDK廢棄永久代元空間

2022-01-17 22:09:50

JVM方法區數據

2025-05-29 03:05:00

Java8內存泄漏

2024-12-16 08:30:00

JVMJava虛擬機Java

2023-05-12 07:40:01

Java8API工具

2022-06-01 16:13:51

元宇宙

2021-03-16 08:35:14

Kubernetes Docker容器

2021-05-11 21:56:11

算法清除JVM

2017-10-31 20:45:07

JavaJava8Optional

2022-02-10 20:26:06

虛擬元宇宙網絡

2022-02-18 00:15:58

Linux指令CPU

2019-09-17 15:30:13

Java編程語言

2021-01-29 07:37:07

內存對象垃圾

2015-09-30 09:34:09

java8字母序列

2015-09-22 11:09:47

Java 8動態代理

2020-12-01 07:18:35

Java8日期時間

2010-09-17 17:02:24

JVM參數

2022-07-19 07:02:47

JVMGC分代收集
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲在线中文字幕 | 成人免费一区二区三区视频网站 | 日韩网站在线观看 | 亚洲精品日韩精品 | 99久久中文字幕三级久久日本 | 欧美高清视频在线观看 | 99久久亚洲 | 午夜一区 | 欧洲尺码日本国产精品 | 国产亚洲日本精品 | 99热视| 天天躁日日躁狠狠的躁天龙影院 | 成年人网站在线观看视频 | 黄色一级片在线播放 | 久久一二区 | 精品一区二区在线视频 | 成人精品国产一区二区4080 | 高清成人免费视频 | 日韩视频中文字幕 | 亚洲第一成人av | 一区二区三区四区在线 | 国产日韩欧美精品一区二区三区 | 国产在线观看不卡一区二区三区 | 成人在线视频网址 | 国产成人精品高清久久 | 欧美一级免费 | 久久精品中文字幕 | 精品视频一区二区三区在线观看 | 国产精品久久久久久久久久久免费看 | 国产精品99久久久久久宅男 | 欧美日韩亚洲三区 | 国产精品久久久久久久久免费软件 | 中国美女一级黄色片 | 国产高清精品一区二区三区 | 91久久精品国产91久久性色tv | 特级黄一级播放 | 精品亚洲一区二区 | 国产成人jvid在线播放 | 亚洲精品日韩在线 | 91精品国产91久久久久久最新 | 成人在线一区二区 |