如何在 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
据我了解,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