首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JDK 8 內存模型大變革:PermGen 退場,Metaspace 登場

     編輯:Java 綜合教學

JVM 內存五大區域(規範)

  1. 虛擬機棧(線程私有,棧幀存局部變量表、操作數棧、方法出口)
  2. 堆(線程共享,GC 主戰場)
  3. 方法區(線程共享,存類元數據、常量、靜態變量)
  4. 程序計數器(線程私有,當前執行指令地址)
  5. 本地方法棧(Native 方法服務)

JDK 8 關鍵變化:PermGen → Metaspace

PermGen 痛點

  • 固定大小(-XX:MaxPermSize),易 OOM: PermGen space。
  • 類卸載條件苛刻,動態生成類(如 Spring CGLIB、JSP 編譯)極易洩漏。
  • 字符串常量池、靜態變量混雜其中,調優困難。

Metaspace 優勢

  • 元空間 使用**本地內存**(Native Memory),不佔用堆,受限於物理內存而非 JVM 參數。
  • 預設無上限,可用 -XX:MaxMetaspaceSize 限制。
  • 類元數據隨類加載器生命週期自然回收,動態類卸載高效。
  • 字符串常量池、靜態變量移至**堆中**,便於 GC 管理。

常用參數對照

JDK 7 (PermGen)JDK 8 (Metaspace)
-XX:PermSize-XX:MetaspaceSize (初始觸發擴容閾值)
-XX:MaxPermSize-XX:MaxMetaspaceSize (上限,預設無限)

實戰調優建議

  • 監控 Metaspace 使用量(jstat -gcmetacapacity、JConsole、Prometheus JMX)。
  • 設定 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m 避免頻繁擴容/無限增長。
  • 關注 Compressed Class Space(-XX:CompressedClassSpaceSize),存儲 Klass 指針壓縮數據。
  • 類加載器洩漏仍會導致 Metaspace OOM,排查動態代理、熱部署場景。
註:原文僅給出 JVM 規範五區域定義與虛擬機棧說明,本文補充完整 JDK 8 Metaspace 變革內容。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved