java - 为什么堆内存在 Java 8 中与元空间一起上升?

标签 java java-8 metaspace

我正在做一个小测试来了解元空间内存(Java 8 及更高版本)的工作原理。 当我动态创建 100,000 个类时,元空间内存在增长(很明显),但堆内存也在​​增长。 有人可以向我解释为什么会这样吗?

PS:我正在使用 128 MB 的堆和 128 MB 的元空间运行测试。

@Test
public void metaspaceTest() throws CannotCompileException, InterruptedException {

ClassPool cp = ClassPool.getDefault();
System.out.println("started");

for (int i = 0; i <= 100000; i++) {
    Class c = cp.makeClass("br.com.test.GeneratedClass" + i).toClass();
    Thread.sleep(1);
    if (i % 10000 == 0) {
    System.out.println(i);
    }
}

System.out.println("finished");
}

见下图:

enter image description here

enter image description here

最佳答案

您的类池使用堆内存。它有哈希表、列表和其他东西。它还使用使用堆内存的 java 反射代码。未被 gc 处理的堆内存可能是类池中的所有数据结构、几个哈希表、链表、数组列表、池等...例如,您创建的每个类都按类存储在哈希表中水池。那是一个 100,000 个元素的哈希表。

其次,如果您正在创建的类中有任何静态初始化器,那将使用堆内存。静态初始化器包括静态字段初始化和静态 block 代码。

关于java - 为什么堆内存在 Java 8 中与元空间一起上升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50414318/

相关文章:

java - Java 8 Comparator 类型推断非常困惑

Java 使用 ProcessBuilder 以静默方式运行程序

java - 尝试在我的 java swing 代码中查找内存泄漏

Java 等价于 Delphi 语言特性

java - 参数返回 void 的可调用/可运行/函数?

java - 如何确定 Java 8 元空间的理想大小

java - Java 元空间和 native 内存的区别

Java 托管基于 APR 的 Apache Tomcat 错误

java - JComboBox 类型不是泛型

java - 如果 Activity 配置文件与正则表达式关键字匹配,如何有条件地在 Spring 中启用类?