-Xms 和 -Xmx 标志是否保留计算机的资源?
我知道JVM进程的标志是允许JVM进程使用特定数量的内存来初始化其进程。关于Java应用程序的性能,通常建议在启动应用程序时为两者设置相同的值,例如。-Xms
-Xms
-Xmx
-Xms2048M -Xmx2048M
我很好奇和标志是否意味着JVM进程为特定的内存量进行预留,以防止同一机器中的其他进程使用它。-Xms
-Xmx
这是对的吗?
我知道JVM进程的标志是允许JVM进程使用特定数量的内存来初始化其进程。关于Java应用程序的性能,通常建议在启动应用程序时为两者设置相同的值,例如。-Xms
-Xms
-Xmx
-Xms2048M -Xmx2048M
我很好奇和标志是否意味着JVM进程为特定的内存量进行预留,以防止同一机器中的其他进程使用它。-Xms
-Xmx
这是对的吗?
Xmx
仅保留虚拟地址空间。 实际上分配(提交)它,但不一定预处理它。Xms
操作系统如何响应分配。
Windows允许您保留非常大的地址空间块(Xmx),但不允许过度使用(Xms)。限制由交换 + 物理定义。例外情况是大页面(需要使用组策略设置启用),这将通过物理 RAM 对其进行限制。
Linux的行为比较复杂,它依赖于相关的系统架构和传递给mmap syscall的各种标志,这在一定程度上可以通过JVM配置标志来控制。行为范围可以从 a) Xms 可以超过总内存 + 交换到 b) Xmx 由可用的物理内存限制。vm.overcommit_memory
简短的回答:取决于操作系统,尽管它在所有流行的操作系统中都绝对是NO。
我将在这里以Linux的内存分配术语为例。
-Xms 和 -Xmx 指定 JVM 堆的最小和最大大小。这些大小反映了虚拟内存分配,这些分配可以随时物理映射到RAM中的页面,称为进程的常驻大小。
当 JVM 启动时,它将分配 -Xms 数量的虚拟内存。一旦在堆上动态创建更多对象,就可以将其映射到驻留内存(物理内存)。此操作不需要 JVM 从操作系统请求任何新分配,但会增加 RAM 利用率,因为这些虚拟页面现在实际上也将具有相应的物理内存分配。但是,一旦您的进程在RAM上消耗了所有Xms分配后尝试在堆上创建更多对象,它必须从操作系统请求操作系统提供更多虚拟内存,这些虚拟内存以后可能会/可能不会映射到物理内存,具体取决于您何时需要它。此限制是 -Xmx 分配。
请注意,这一切都是可能的,因为linux中的内存是共享的。因此,即使进程事先分配内存,它得到的只是虚拟内存,它只是一个可寻址的连续虚构分配,可能会或可能不会映射到真实的物理页面,具体取决于需求。阅读此答案,了解内存管理在流行操作系统中的工作原理的简短说明。这里有一个关于Linux内存管理如何工作的详细(略微过时但非常有用)的信息。
另请注意,这些标志仅影响堆大小。您将看到的驻留内存大小将大于当前的 JVM 堆大小。更具体地说,JVM 消耗的内存等于其堆大小加上直接内存,它反映了来自方法堆栈、本机缓冲区分配等的内容。