java 类元数据是不是在堆上?

Posted

技术标签:

【中文标题】java 类元数据是不是在堆上?【英文标题】:Do java classes metadata go on the heap?java 类元数据是否在堆上? 【发布时间】:2013-07-02 16:37:42 【问题描述】:

在 Java 中,当类加载器加载类文件时,加载的类在哪里?在堆里?我知道对象位于堆中,但类本身呢?在 Java 中,甚至 Class 也是一个 Object,所以我猜它在堆上?

【问题讨论】:

【参考方案1】:

与加载的类相关的信息(方法、字段等)位于method area。

虽然方法区在逻辑上是堆的一部分,但很简单 实现可以选择不进行垃圾收集或压缩 它。此版本的 Java 虚拟机规范不 规定方法区域的位置或用于管理的策略 编译代码。

方法区可能是也可能不是堆的一部分,完全由 JVM 实现来决定将它存储在哪里。

Class 对象本身将存储在堆上。

【讨论】:

【参考方案2】:

从 Java 8 版本开始,“类元数据”存储在元空间区域中。 MetaSpace 区域的美妙之处在于它会在需要时自动增长,我们也可以通过设置 maxMetaSpaceSize 来设置它的上限。

在 Java 8 发布之前,它曾经是 PermGen 区域的一部分。 PermGen 是堆的一部分,所以从这个意义上说是的,对于你的问题。

PermGen vs Metaspace

【讨论】:

以上是关于java 类元数据是不是在堆上?的主要内容,如果未能解决你的问题,请参考以下文章

Juc18_Java内存模型对象头Mark Word实例数据对齐填充谈谈new Object( )占多大内存

类元数据Class Metadata

java对象的存储结构和指针压缩学习

Java中对象都是分配在堆上吗?你错了!

Java原语可以被视为轻对象吗?

使用 proguard / R8 删除数据类元数据