我正在做一个小测试来了解元空间内存(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");
}
见下图:
最佳答案
您的类池使用堆内存。它有哈希表、列表和其他东西。它还使用使用堆内存的 java 反射代码。未被 gc 处理的堆内存可能是类池中的所有数据结构、几个哈希表、链表、数组列表、池等...例如,您创建的每个类都按类存储在哈希表中水池。那是一个 100,000 个元素的哈希表。
其次,如果您正在创建的类中有任何静态初始化器,那将使用堆内存。静态初始化器包括静态字段初始化和静态 block 代码。
关于java - 为什么堆内存在 Java 8 中与元空间一起上升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50414318/