java如何保证预留内存
How does java guarateee reserved memory
使用此命令检查 stack 的内存使用情况:
jcmd $pid VM.native_memory summary
我可以看到保留的内存与提交的内存不同。
-
Thread (reserved=18561KB, committed=1085KB)
(thread #18)
(stack: reserved=18476KB, committed=1000KB)
(malloc=63KB #99)
(arena=22KB #35)
保留大约 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 直到页面被触摸才被分配;甚至在那之后,它可以通过分页虚拟内存的动态再次被带走,部分取决于硬件上发生的其他事情。
使用此命令检查 stack 的内存使用情况:
jcmd $pid VM.native_memory summary
我可以看到保留的内存与提交的内存不同。
-
Thread (reserved=18561KB, committed=1085KB) (thread #18) (stack: reserved=18476KB, committed=1000KB) (malloc=63KB #99) (arena=22KB #35)
保留大约 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 直到页面被触摸才被分配;甚至在那之后,它可以通过分页虚拟内存的动态再次被带走,部分取决于硬件上发生的其他事情。