java如何保证预留内存

How does java guarateee reserved memory

使用此命令检查 stack 的内存使用情况:

jcmd $pid VM.native_memory summary

我可以看到保留的内存与提交的内存不同。

保留大约 1MB(堆栈的默认值)。承诺其实是物理保留。我读到 java 在未完全使用时为堆栈节省内存。

运行 命令像 top 我可以看到刚刚提交的用法。

为了保留这个内存而不被RSS(linux内存度量)统计,java/SO做了什么?

由于没有物理保留,其他进程是否可以使用此内存?

注:jdk11 SO Linux

What does java/SO do in order to reserve this memory without being counted by RSS (linux memory measure) statistics?

这种“预留”是基于Virtual Memory. The JVM calls mmap的概念来预留一个地址space。最初这些地址只是没有物理页面支持的数字。在第一次访问虚拟页面时,发生页面错误,OS 通过分配后备存储(物理 RAM 或交换 space)来处理它。

Could other process use this memory due that is no physically reserved?

简而言之,是的。更长的答案 - 取决于 OS 设置,特别是 vm.overcommit_memory and vm.overcommit_ratio sysctls。默认设置允许过度使用 - 即可以分配比可用物理 RAM + 交换空间更多的虚拟内存(因为应用程序通常不会使用它们保留的所有虚拟内存)。

您需要了解,在任何现代操作系统中,“内存”都是虚拟的。

“保留”内存实际上只是分配给特定用途的地址 space。这意味着主要是对跟踪 address-space 使用的数据结构进行一些调整。

“承诺”的记忆有点不稳定。大多数情况下,它只是意味着 可能 需要的物理内存是根据可用的最大提交的某些概念进行跟踪的。在这一点上,通常没有实际物理 RAM 以某种方式分配给进程的概念;充其量,页面文件 space 可能会被保留。

(如果您想要实际的 for-sure RAM,您需要将提交的页面“固定”到物理内存中)。

实际 RAM 直到页面被触摸才被分配;甚至在那之后,它可以通过分页虚拟内存的动态再次被带走,部分取决于硬件上发生的其他事情。