根据我的理解,Native Heap 是给一个java进程分配最大Heap size后剩下的内存。
对于 32 位 Java 进程 - 可以分配给该进程的最大虚拟内存为 4GB。在这总的 4GB 中,假设我们为 max Heap 设置了 2GB,并且 OS 使用了 1GB。那么,剩下的 1GB 内存可以称为 Native Heap 吗?
同样,对于 64 位 java 进程,可以分配给进程的最大内存可以大于 4GB。比方说,我的系统中有 16GB RAM,那么可以分配给我系统中每个进程的最大虚拟内存将是 16GB,因为虚拟地址空间范围不允许超过 16GB 的内存。对吗?
那么,64 位 Java 进程的本机堆将 (16-2(-Xmx) -1(OS)) 即 15GB?
我对 Native Heap 计算的理解是否正确?
如果我的理解是正确的,那么为什么我们说从 Native 内存分配的Metaspace的最大可用内存是总可用系统内存。每个进程获得的最大虚拟内存将是系统中可能的最大虚拟可寻址范围,其中一些内存将被堆和操作系统占用。
如果我们将分配给进程的总内存设置为堆内存,那么它会不会抛出outOfMemoryError:Metaspace,因为该进程没有可用的 Native Heap ?
请帮助我纠正我的理解。谢谢。