为什么 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. “天翼云息壤杯”高校AI大赛福建赛区启动!

    11月20日,2024首届全国"天翼云息壤杯"高校AI 大赛(福建赛区)正式启动.中国电信福建公司携手华为公司.福建省计算机学会.福建省自动化学会,正式启动天翼云科技有限公司承办的 ...

  2. TortoiseGit拉取出现“Could not open repository. libgit2 returned: repository path……”错误的解决办法

    TortoiseGit拉取出现"Could not open repository. libgit2 returned: repository path--"错误的解决办法 1.问 ...

  3. Linux安装Jenkins指南

    Linux安装Jenkins指南 Jenkins,作为一款开源的自动化服务器,广泛用于持续集成和持续部署(CI/CD)流程中.它提供了强大的插件生态系统,使得集成各种开发工具.版本控制系统和构建工具变 ...

  4. Linux安装fastdfs图片服务器

    1.阿里云安装centos7服务器 得到用户名密码和ip后用securCrt连接工具链接远程主机 2.安装fastdfs图片服务器 (1)上传需要的压缩包 libfastcommon-common.z ...

  5. FLink15--滑动窗口--SlidingWindiwApp

    一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 概念:滑动窗口有两个参数,窗口大小20和滑动大小6,6秒滑一次,统计近20秒数据 前 ...

  6. 流程控制之if选择结构

    if单选择结构  if (布尔表达式){     //如果布尔表达式为ture将执行的语句 } 实例:  package com.yeyue.struct; ​ import java.util.Sc ...

  7. 探秘Transformer系列之(5)--- 训练&推理

    探秘Transformer系列之(5)--- 训练&推理 0x00 概述 Transformer训练的目的是通过对输入源序列和模型输出序列的学习,来拟合真正的目标序列.推理的目的则是仅通过输入 ...

  8. 八米云高收益PCDN-N1设备重要通知

    八米云单价: 电联2400元/G/月 移动1500元/G/月 新上机设备[必须使用新镜像]上机!否则无业务下发! 再次强调!如6.18日后台镜像更新后–还在使用旧镜像新上机,请务必于[6月30日]前用 ...

  9. [解决方案][docker] Http: server gave HTTP response to HTTPS client

    前言 用centos运行docker不支持http,需要在daemon.json 里面配置一下 目录 没有daemon.json 需要添加这个文件 在daemon.json 增添配置 重启即可 一.l ...

  10. PHP 命名空间与spl_autoload_register() 自动加载机制

    转:https://www.cnblogs.com/chihuobao/p/9895202.html include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 in ...