为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?

在 Java 8 中,JVM 移除了 永久代(PermGen)并引入了 元空间(Metaspace),这一改变主要是为了解决 PermGen 空间不足内存管理效率低 的问题。以下是具体原因和改动的细节。


1. 永久代的局限性

  • PermGen 是 JVM 内存的一部分,用于存储类的元数据(如类信息、常量池、方法数据等)。
  • PermGen 有固定的大小,由 -XX:PermSize-XX:MaxPermSize 参数设置。
  • 由于其大小是固定的,当 PermGen 空间不足时,JVM 会抛出 java.lang.OutOfMemoryError: PermGen space 错误。
  • PermGen 空间不能自动扩展,导致当加载大量类或使用大量动态生成的类时容易发生内存溢出。

2. 引入元空间(Metaspace)

Java 8 引入的 元空间(Metaspace)替代了 PermGen,主要变化包括:

  • 动态调整大小:元空间的大小不再是固定的,可以动态扩展,解决了 PermGen 空间不足的问题。
  • 本地内存:与 PermGen 不同,元空间并不位于 Java 堆中,而是使用本地(Native)内存,减少了对堆内存的依赖。
  • GC 管理:元空间的垃圾回收由 JVM 管理,但它与堆内存的垃圾回收相分离,能够独立处理。

3. 优点

  • 避免内存溢出:通过动态分配内存,避免了 PermGen 空间不足的错误。
  • 优化类的加载和卸载:类的加载和卸载变得更加高效,减少了内存碎片。
  • 降低管理复杂性:不再需要调整 -XX:PermSize-XX:MaxPermSize 参数,简化了 JVM 调优。

4. 总结

变化 PermGen Metaspace
内存存储位置 堆内存的一部分 本地内存(Native Memory)
大小限制 固定大小,容易发生 OOM 动态扩展,灵活调整
回收管理 堆内存回收管理 独立的垃圾回收机制,与堆内存分离
问题 空间不足,内存碎片 性能提高,内存管理更高效

结论

  • Java 8 引入的 元空间 解决了 PermGen 空间不足内存管理不灵活 的问题,为 JVM 提供了更灵活的内存管理机制。

为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?的更多相关文章

  1. Metaspace 之一:Metaspace整体介绍(永久代被替换原因、元空间特点、元空间内存查看分析方法)

    回顾 根据JVM内存区域的划分,简单的画了下方的这个示意图.区域主要分为两大块,一块是堆区(Heap),我们所New出的对象都会在堆区进行分配,在C语言中的malloc所分配的方法就是从Heap区获取 ...

  2. 深入理解java虚拟机---JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)(十二)

    引用:https://www.cnblogs.com/yulei126/p/6777323.html JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)   1.背景 2.为什么废 ...

  3. java虚拟机-JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)

    一.背景 1.1 永久代(PermGen)在哪里? 根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域. 关于方 ...

  4. Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)

    Java8内存模型—永久代(PermGen)和元空间(Metaspace) 查看原文点击传送门:http://www.cnblogs.com/paddix/p/5309550.html 提示:本文做了 ...

  5. Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...

  6. (转)Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    背景:介绍java8中永久代到元空间的转变. Java8内存模型—永久代(PermGen)和元空间(Metaspace) 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法 ...

  7. 永久代 PermGen 简述

    永久代(PermGen) 绝大部分 Java 程序员应该都见过 “java.lang.OutOfMemoryError: PermGen space “这个异常.这里的 “PermGen space” ...

  8. 转:Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...

  9. Java8内存结构—永久代(PermGen)和元空间(Metaspace)

    本文转载 作者:liuxiaopeng 博客地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分 ...

  10. java 8中撤销永久代,引入元空间

    撤销永久代,引入元空间: 在 JDK 1.8 中,HotSpot 已经没有 “PermGen space”这个空间了,取而代之是一个叫做 Metaspace(元空间) 的东西. Java7中已经将字符 ...

随机推荐

  1. vim系列-文本操作篇

    基数行与偶数行分组 使用Vim的替换命令,可以轻松地将基数行和偶数行分组: %s/\(^.*$\)\n\(^.*$\)/\1 \2/g 然后,删除所有的基数行: %s/^.*$\n\(^.*$\)/\ ...

  2. Oracle生成awr报告操作步骤

    1.cmd命令窗口 以sysdba身份登录Oracle 2.执行@?/rdbms/admin/awrrpt命令,并选择报告类型为HTML.输入天数以选择生成报告的时间段,一般默认为最近7天.输入报告开 ...

  3. java线上问题跟踪工具Arthas的第一次使用

    Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参.异常,监测方法执行耗时 ...

  4. Nodify学习 二:添加节点

    Nodify学习 一:介绍与使用 - 可乐_加冰 - 博客园 (cnblogs.com) Nodify学习 二:添加节点 - 可乐_加冰 - 博客园 (cnblogs.com) 添加节点(nodes) ...

  5. OpenStack基本介绍

    本文分享自天翼云开发者社区<OpenStack基本介绍>,作者:m****n 基本介绍 OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenSt ...

  6. 安全可信 | 首批!天翼云边缘安全加速平台AccessOne通过信通院“软件自研创新能力”专项评估

    近日,中国信息通信研究院(以下简称"中国信通院")公布"软件自研创新能力"专项评估(简称"可信研创")结果,天翼云边缘安全加速平台Acces ...

  7. Linux mint安装百度云

    deb包下载 BCloud 作者官网https://github.com/XuShaohua/bcloud-packages 链接: https://pan.baidu.com/s/1hskY04G ...

  8. C#/.NET/.NET Core技术前沿周刊 | 第 25 期(2025年2.1-2.9)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  9. 最新demo版|如何0-1开发支付宝小程序之前期准备篇(一)

    小程序作为目前一种轻量.便捷的应用.目前应用越来越广泛了. 很多没有开发经验的开发同学可能初次接触就是小程序开发,为了详细讲解下小程序开发的步骤,我会按照小程序的开发流程一步一步从零开始给大家介绍下如 ...

  10. mysql连接出现java.sql.sql exception:服务器时区值'''_''''无法识别或表示多个时区

    在连接mysql的JDBC的url后面加上服务器的时区:serverTimezone=UTCjdbc:mysql://localhost:3306/geek?useUnicode=true&c ...