如何在 Java 中管理元空间和本地区域内存?

How does Metaspace and Native Area memory gets managed in Java?

据我了解,JVM 内的 Native Area 完全禁止垃圾收集器使用。 Metaspace 所在的 Native Area 内。在前面提到的Metaspace中,我们有Constant Pool、Field和Method Data.

等区域

既然 Native Area 是由 C++ 内存管理管理的(或者至少我是这么理解的),为什么 Metaspace 不是固定大小,而是根据内存大小动态增长需要,会不会运行出内存? Metaspace 是否允许垃圾收集器,但 Native Area 的其余部分不允许? C++ 是否在那里动态管理内存?

how come that Metaspace, that is not of a fixed size

您可以通过在命令行上设置 MaxMetaSpaceSize 的值来限制大小。

...will not run out of the memory?

是的,它确实 运行 内存不足。当它超过可用内存的使用量时,将得到 java.lang.OutOfMemoryError: Metaspace 异常。

Is Garbage Collector allowed in the Metaspace

是的。 GC 将收集 Java 堆和元空间,但不收集本机堆。它由拥有它的本机代码的任何人管理。

参考:

3.2 Understand the OutOfMemoryError Exception

About G1 Garbage Collector, Permanent Generation and Metaspace