Java 13中静态成员是否属于metaspace?元空间是否属于堆、位于native内存?
Java 13 HotSpot 环境下 Metaspace 相关规则解答
以下结论默认基于 OpenJDK/Oracle 官方 HotSpot 虚拟机实现,其他虚拟机实现(如 OpenJ9)可能存在差异:
问题1:静态方法、静态字段、静态代码块是否属于 Metaspace?
三类内容的存储规则分别如下:
- 静态方法:方法的元数据(包含字节码内容、方法签名、访问标识、JIT 编译关联的元信息等)存储在 Metaspace 中,存储逻辑和普通实例方法的元数据完全一致。
- 静态字段:从 Java 8 开始到 Java 13,静态字段(类变量)都不存储在 Metaspace 中,它跟随对应的
java.lang.Class实例存储在堆内存中,这是和永久代(PermGen)时代最核心的差异之一。 - 静态代码块:静态代码块本质是 JVM 识别的类初始化特殊方法
<clinit>,它的字节码、执行元信息均存储在 Metaspace 中。
问题2:Metaspace 是否属于堆内存,是否处于 native 内存中?
- Metaspace 完全不属于 JVM 堆(Heap)内存的管辖范围,是独立于堆的内存区域。
- Metaspace 的内存直接从本地内存(Native Memory,即操作系统层面的进程用户空间内存)分配,默认情况下仅受限于当前进程可用的本地内存上限,也可通过 JVM 参数
-XX:MaxMetaspaceSize手动指定最大可用容量。
内容的提问来源于stack exchange,提问作者cpu
相关产品推荐
相关产品推荐

