当前位置: 首页 > news >正文

【Java】Java永久代:从诞生到终结的演进史

Java永久代(Permanent Generation,简称 PermGen)是 Java 虚拟机(JVM)在JDK 7 及以前版本中用于实现方法区的一个内存区域。

理解永久代,最核心的一句话是:永久代是 HotSpot JVM 对“方法区”这一 JVM 规范的具体实现。(就像堆是 Java 对象存放的地方一样,永久代是类元数据存放的地方)。

以下是关于永久代的详细解析:

1. 永久代里存了什么?

在 JDK 7 之前,永久代主要存储以下信息:

  • 类元数据:类的结构、字段、方法、构造函数等字节码信息。
  • 运行时常量池:包括类编译后的字面量和符号引用。
  • 字符串常量池:存储程序中的字符串字面量。
  • 静态变量:类级别的变量。
  • JIT 编译后的代码:即时编译器编译后的本地机器码(部分情况下)。
  • 类加载器信息:包括系统类加载器和自定义类加载器的引用。

2. 永久代为什么被移除?(痛点在哪里?)

在 JDK 8 中,Oracle 正式完全移除了永久代,将其替换为元空间。永久代被移除的主要原因包括:

  • 内存大小固定,容易发生 OOM:
    永久代的大小在启动时通过-XX:MaxPermSize指定,一旦设定很难动态调整。如果在运行时加载了大量的类(例如使用大量动态代理、反射、JSP重编译的Web应用),很容易抛出著名的错误:java.lang.OutOfMemoryError: PermGen space
  • 垃圾回收效率低:
    永久代的垃圾回收(Full GC)条件苛刻,主要针对常量池中的无用常量和卸载无用的类。由于类卸载的条件非常严格(该类所有的实例都已被回收,加载该类的ClassLoader已经被回收等),导致永久代的内存经常只增不减,引发内存泄漏。
  • 合并 HotSpot 与 JRockit 虚拟机:
    Oracle 收购了 BEA 公司(拥有 JRockit JVM),打算将 HotSpot 和 JRockit 的优秀特性合并。JRockit 中并没有永久代的概念,为了统一架构,Oracle 决定废弃永久代。

3. JDK 7 到 JDK 8 的演变(重要分水岭)

为了平滑过渡,永久代的移除是分步骤进行的:

  • JDK 6 及以前:永久代完整存在,包含上述所有内容。
  • JDK 7:开始“拆除”永久代。
    • 字符串常量池被从永久代移到了Java 堆中。
    • 符号引用被移到了 Native Memory(本地内存)。
    • 原因:字符串常量池在堆中更容易被垃圾回收,且与 Java 对象的生命周期管理更一致。
  • JDK 8:彻底废除永久代。
    • 将类元数据、运行时常量池等剩余内容全部移到了元空间中。

4. 永久代 vs 元空间

这是面试中最常被问到的对比:

特性永久代 (JDK 7及以前)元空间 (JDK 8及以后)
所在位置JVM 进程内存中本地内存
默认大小较小,受限于-XX:MaxPermSize默认无上限(仅受限于物理内存)
内存溢出风险极高 (PermGen space)较低,但可能耗尽物理内存导致被OS杀死
GC 触发频繁触发 Full GC元空间垃圾回收与堆解耦,条件更宽松
调优参数-XX:PermSize/-XX:MaxPermSize-XX:MetaspaceSize/-XX:MaxMetaspaceSize

5. 面试常考考点总结

  1. 方法区与永久代的关系?
    • 方法区是 JVM 规范中定义的一个逻辑区域。
    • 永久代是 JDK 7 以前 HotSpot JVM 对方法区的实现。
    • 元空间是 JDK 8 及以后 HotSpot JVM 对方法区的实现。
  2. 字符串常量池在哪里?
    • JDK 6:永久代。
    • JDK 7 及以后:Java 堆中。
  3. 为什么用元空间替换永久代?
    • 因为永久代大小固定,容易 OOM;而元空间使用本地内存,大小随需增长,极大地降低了由于加载过多类导致的OOM问题。

注:如果你在运行 JDK 8 或更高版本的代码时,在启动参数中加上了-XX:MaxPermSize=512m,JVM 会直接报错并拒绝启动,提示该参数已被忽略或废弃。

http://www.gsyq.cn/news/1616053.html

相关文章:

  • 该原标题存在营销诱导词,不符合要求,若按照关键词“重罪辩护”生成趋势洞察型标题,可改为:2026年重罪辩护行业趋势洞察:策略与挑战并存
  • 2026最新AI论文工具全解析,从新手到高手的进阶必备攻略
  • YimMenu终极指南:GTA5免费增强菜单与安全防护完全教程
  • Tool 定义进阶:异步处理、流式输出、进度反馈与错误码规范的生产级标准
  • 数据结构 五
  • ROG幻16Air Type-C外接显示器休眠唤醒雪花屏问题分析与解决
  • 济南天桥区上门电脑维修
  • 物理时空的数字降维:企微API智能硬件IoT边缘枢纽的MQTT多路复用、离线重放整形与时钟校验架构
  • 【2026最新版】全网最全网络攻防教程(0基础到进阶、漏洞挖掘、CTF比赛、就业等等)
  • 技术拆解:电子护照芯片数据为何绝对可信、无法篡改?
  • B站评论采集实践:如何快速获取评论数据并接入AI分析平台
  • Windows10上安装MySQL操作步骤
  • ABAP :新语法 - REF
  • 当灯光“躲”进陪伴机器人:智能照明的隐藏式进化与异业合作新浪潮
  • 从零到一:在STM32上跑通TinyML的完整实践指南
  • 哔哩下载姬完整指南:告别网络焦虑,轻松掌控B站视频资源
  • 工业4-20mA电流环设计:DAC161S997与PIC32实战解析
  • HarmonyOS7 缓存不是越多越好:图片、数据、视图多层缓存策略这样定
  • VSCode JSON 样式
  • 2026年6月份化工储存用玻璃钢储罐,源头生产企业该如何筛选
  • 亿俐缇国际物流(YLT GLOBAL)——中东双清包税门到门物流服务的优势与特点
  • Spring Cloud Alibaba 生产级实战:16 个模块覆盖全栈微服务
  • 亲测有效:瑜伽缓解腰痛的南湖实践分享
  • 预约小程序怎么搭建?全球5款工具实测:餐宝盈/BBWEYY/比文云/Brizy/PageXL(2026年7月更新),含零代码SAAS、AI编程、源码定制交付
  • STC3115+PIC18F97J94电池监控系统设计与优化
  • 四个看不见的成本漏洞,系统一个一个帮你堵上
  • HarmonyOS7 购物车看着简单最容易翻车:增删改、全选、价格计算一篇讲透
  • 云尖信息参编《Token驱动智能经济研究报告》正式发布
  • 恶意软件窃取 Chrome 会话 Cookie 的攻击机制与防御研究
  • CVE-2025-12108漏洞应急响应实战:从情报研判到深度防御的完整指南