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 类元数据是不是在堆上?的主要内容,如果未能解决你的问题,请参考以下文章