Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java -Xms和-Xmx标志是否保留机器';谁的资源?_Java_Jvm - Fatal编程技术网

Java -Xms和-Xmx标志是否保留机器';谁的资源?

Java -Xms和-Xmx标志是否保留机器';谁的资源?,java,jvm,Java,Jvm,我知道JVM进程的-Xms标志是允许JVM进程使用特定数量的内存来初始化其进程。关于Java应用程序的性能,通常建议在启动应用程序时将相同的值设置为-Xms和-Xmx,如-Xms2048M-Xmx2048M 我很好奇-Xms和-Xmx标志是否意味着JVM进程为特定数量的内存预留空间,以防止同一台机器中的其他进程使用它 是这样吗 JVM进程是否为特定的内存量进行了保留 是的,JVM在开始时保留由Xms指定的内存,并且最多可以保留Xmx,但保留不需要在物理内存中,也可以在交换中。JVM页面将根据需要

我知道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感谢您对其进行编辑。