Java -Xms和-Xmx标志是否保留机器';谁的资源?
我知道JVM进程的Java -Xms和-Xmx标志是否保留机器';谁的资源?,java,jvm,Java,Jvm,我知道JVM进程的-Xms标志是允许JVM进程使用特定数量的内存来初始化其进程。关于Java应用程序的性能,通常建议在启动应用程序时将相同的值设置为-Xms和-Xmx,如-Xms2048M-Xmx2048M 我很好奇-Xms和-Xmx标志是否意味着JVM进程为特定数量的内存预留空间,以防止同一台机器中的其他进程使用它 是这样吗 JVM进程是否为特定的内存量进行了保留 是的,JVM在开始时保留由Xms指定的内存,并且最多可以保留Xmx,但保留不需要在物理内存中,也可以在交换中。JVM页面将根据需要
-Xms
标志是允许JVM进程使用特定数量的内存来初始化其进程。关于Java应用程序的性能,通常建议在启动应用程序时将相同的值设置为-Xms
和-Xmx
,如-Xms2048M-Xmx2048M
我很好奇-Xms
和-Xmx
标志是否意味着JVM进程为特定数量的内存预留空间,以防止同一台机器中的其他进程使用它
是这样吗
JVM进程是否为特定的内存量进行了保留
是的,JVM在开始时保留由Xms
指定的内存,并且最多可以保留Xmx
,但保留不需要在物理内存中,也可以在交换中。JVM页面将根据需要移入和移出内存
为什么建议Xms和Xmx具有相同的值 注意:对于机器专用于单个应用程序(或者没有太多应用程序竞争系统资源)的生产系统,通常建议设置
Xms
和Xmx
。这并不是一概而论,它在任何地方都是好的
避免堆大小:
JVM最初以Xms
值指定的堆大小开始。由于应用程序分配对象而耗尽堆时。JVM开始增加堆。每次JVM增加堆大小时,它都必须向操作系统请求额外的内存。这是一个耗时的操作,会增加gc暂停时间并缩短请求的响应时间
应用程序的长期行为:
尽管我不能概括,但从长远来看,许多应用程序最终会增长到最大堆值。这是另一个开始使用最大内存的原因,而不是随着时间的推移而增加堆并产生不必要的堆大小调整开销。这就像要求应用程序在开始时占用最终将占用的内存
地面军事系统的数量::
从较小的堆大小开始会导致更频繁的垃圾收集。更大的堆大小会减少发生的GC数量,因为有更多的内存可用于对象分配。但是,必须注意,增加堆大小会增加gc暂停时间。这是一个优势,只有当您的垃圾收集已被正确调整,并且暂停时间不会随着堆大小的增加而显著增加时
这样做的另一个原因是服务器通常都有大量内存,所以为什么不使用可用的资源呢?简短的回答:取决于操作系统,尽管在所有流行的操作系统中,这肯定是否定的 这里我将以Linux的内存分配术语为例 -Xms和-Xmx指定JVM堆的最小和最大大小。这些大小反映了虚拟内存分配,虚拟内存分配可以在任何时候物理映射到RAM中称为进程驻留大小的页面 当JVM启动时,它将分配-Xms数量的虚拟内存。一旦在堆上动态创建更多对象,就可以将其映射到驻留内存(物理内存)。此操作将不需要JVM从操作系统请求任何新的分配,但会提高RAM利用率,因为这些虚拟页面现在实际上也会有相应的物理内存分配。然而,一旦您的进程在耗尽其在RAM上的所有Xms分配后尝试在堆上创建更多对象,它就必须请求操作系统从操作系统获得更多虚拟内存,这些虚拟内存可能/可能不会在以后映射到物理内存,这取决于您何时需要它。这个限制是您的-Xmx分配 注意,这一切都是可能的,因为linux中的内存是共享的。因此,即使进程预先分配内存,它得到的也是虚拟内存,这只是一个可寻址的连续虚拟分配,根据需要可能映射到实际物理页,也可能不映射到实际物理页。请阅读,以获取有关内存管理如何在流行操作系统中工作的简短说明。是一个关于Linux内存管理工作原理的非常详细的信息(有点过时,但非常有用)
还要注意,这些标志只影响堆大小。您将看到的驻留内存大小将大于当前JVM堆大小。更具体地说,JVM消耗的内存等于其堆大小加上直接内存,直接内存反映了来自方法堆栈、本机缓冲区分配等的内容。
Xmx
仅保留虚拟地址空间。
Xms
实际上分配(提交)了它,但不一定会预先出错
操作系统对分配的响应方式各不相同
Windows允许您保留非常大的地址空间块(Xmx),但不允许过度使用(Xms)。限制由交换+物理定义。例外情况是大页面(需要通过组策略设置启用),这将通过物理ram限制它
Linux行为更为复杂,它取决于
vm.overmit_memory
以及传递给syscall的相关sysctl和各种标志,在某种程度上可以由JVM配置标志控制。行为范围从a)Xms可以超过总ram+交换到b)Xmx由可用的物理ram限制。有趣的。。。当使用时,是否应该-XX:+AlwaysPrefault
预先损坏内存?@Eugene sure,因此-Xms
的“不一定”是内存的大小,这些区域被配置为适合内部。如果您有一个大部分未使用的终身空间,则实际大小可能会小得多。@PeterLawrey感谢您对其进行编辑。