永久代(Permanent Generation)和元空间(Metaspace)

embedded/2024/9/25 8:03:02/

永久代(Permanent Generation)和元空间(Metaspace)是Java虚拟机(JVM)内存管理中的两个概念,主要区别在于它们的实现方式和内存分配策略。

永久代(Permanent Generation)

概念:永久代是HotSpot JVM中的一个特殊的内存区域,用于存储类的元数据(类的信息、常量池、方法数据等),直到JVM停止运行。这部分内存属于堆内存的一部分。

特点

  1. 固定大小:永久代的大小在启动JVM时通过参数(如-XX:PermSize-XX:MaxPermSize)设置,不能动态扩展。
  2. 垃圾收集:永久代使用传统的垃圾收集机制,可能导致Full GC。由于永久代的空间有限,类加载过多或生成大量动态类(如大量JSP编译)可能导致java.lang.OutOfMemoryError: PermGen space错误。
  3. 性能影响:由于永久代与堆内存共享内存资源,频繁的Full GC可能会影响应用程序的性能。

元空间(Metaspace)

概念:元空间是从Java 8开始引入的一种新的内存管理机制,用于替代永久代。元空间不再使用堆内存,而是使用本地内存(Native Memory)。

特点

  1. 动态扩展:元空间的大小可以根据需要动态调整,其初始大小可以通过参数(如-XX:MetaspaceSize-XX:MaxMetaspaceSize)设置,但不限制在堆内存内,默认情况下可以使用几乎所有可用的本地内存。
  2. 垃圾收集:元空间中不再存在类似于永久代的空间限制,因此更少出现OutOfMemoryError。当达到设定的阈值时,会触发垃圾收集来回收不再使用的类元数据。
  3. 性能改进:由于元空间使用本地内存,减轻了堆内存的压力,垃圾收集器对堆内存的管理更加高效,减少了Full GC的次数,提升了性能。

相同点

存储内容:

  1. 类元数据:同样包括类的名称、访问修饰符、超类、接口、字段、方法等信息。
  2. 运行时常量池:与永久代中的内容一致,包括类中用到的字面量和符号引用。
  3. 方法数据:包括方法的字节码、JIT编译后的代码、方法的局部变量表、异常表等。
  4. 静态变量:类的静态字段和常量。
  5. 类加载器的相关数据:与类加载器相关的一些辅助数据。

主要区别

  1. 内存位置

    • 永久代:使用JVM堆内存的一部分。
    • 元空间:使用本地内存。
  2. 内存管理

    • 永久代:固定大小,需要在启动时设置,无法动态扩展。
    • 元空间:大小可动态调整,受限于系统的可用内存。
  3. 垃圾收集

    • 永久代:垃圾收集频繁且可能导致Full GC,影响性能。
    • 元空间:垃圾收集更加高效,减少了Full GC的影响。
  4. 错误类型

    • 永久代:容易出现java.lang.OutOfMemoryError: PermGen space错误。
    • 元空间:较少出现OutOfMemoryError,管理更加灵活。

内存分配:

1、永久代:由于使用堆内存的一部分,永久代的大小受堆内存大小的限制,配置参数如-XX:PermSize-XX:MaxPermSize用于设置其初始大小和最大大小。
2、元空间:使用本地内存,大小受限于系统的可用内存,可以通过-XX:MetaspaceSize-XX:MaxMetaspaceSize来配置初始大小和最大大小,但默认情况下可以动态扩展。

总结

永久代和元空间的主要区别在于内存管理方式和位置。永久代在JVM堆内存中管理类的元数据,而元空间则利用本地内存,带来了更灵活和高效的内存管理,减少了内存溢出和垃圾收集的压力。通过这种改进,元空间提高了Java应用程序的性能和稳定性。


http://www.ppmy.cn/embedded/44196.html

相关文章

使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录 (一)Supabase(二)Realtime(消息)(2.1)Python 消息订阅(2.2)JavaScript 消息订阅 (三)Storage(存储)&…

python规则表达式re模块:笔记0529

Python语言使用printf printf:https://blog.51cto.com/u_16099181/7758801 使用python进行自动化运维脚本编写时经常需要处理远程设备返回到控制字符,比如下面这个例子,控制字符在使用print进行调试输出时因为是非ascii字符不显示&#xff0…

Vue插槽solt如何传递具名插槽的数据给子组件?

在Vue中,你可以通过作用域插槽(scoped slots)来传递数据给子组件。这同样适用于具名插槽。首先,你需要在子组件中定义一个具名插槽,并通过v-slot指令传递数据。例如: 子组件(ChildComponent.vu…

长安链使用Golang编写智能合约教程(二)

长安链2.3.0的go合约虚拟机和2.3.0以下的不兼容,编译的方式也有差异,所以在ide上做了区分。 教程三会写一些,其他比较常用SDK方法的解释和使用方法 教程一:(长安链2.1.的版本的智能合约) 教程三&#xff…

C#【进阶】特殊语法

特殊语法、值和引用类型 特殊语法 文章目录 特殊语法1、var隐式类型2、设置对象初始值3、设置集合初始值4、匿名类型5、可空类型6、空合并操作符7、内插字符串8、单句逻辑简略写法 值和引用类型1、判断值和引用类型2、语句块3、变量的生命周期4、结构体中的值和引用5、类中的值…

类似笔趣阁的免费软件有什么?看小说app哪个最好最全?试试这些任何小说都能看的软件

笔趣阁哪个才是正版?相信很多人想知道答案。 今天阿星跟大家聊聊那些能免费读小说、看全网漫画的app,低调推荐,希望让你告别书荒! 追书大全 首先登场的是“追书大全”这款APP,简直是小说迷的天堂! 在这…

Sketch v100 for Mac 安装教程【支持M芯片】

Sketch v100 for Mac 安装教程【支持M芯片】 原文地址:https://blog.csdn.net/weixin_48311847/article/details/139104315

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…