Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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 JVM选项:Xmx分配_Java_Jvm - Fatal编程技术网

Java JVM选项:Xmx分配

Java JVM选项:Xmx分配,java,jvm,Java,Jvm,尽管这个问题非常基本,但我愿意理解JVM的最大内存分配是如何分配给应用程序的。我有一个运行在Windows2008服务器上的应用程序,它承载着大约60个虚拟托管服务器(即60个JVM)。每个托管服务器的最大堆设置为1024m。Windows配置了32 GB RAM 现在的问题是,如何为JVM分配最大内存?它是一次性完成的还是在增量增长的基础上完成的?如果一次性完成,Windows如何处理在32 GB RAM打包系统中托管我的应用程序的所有60台托管服务器 任何意见都非常感谢。谢谢。JVM最初分配

尽管这个问题非常基本,但我愿意理解JVM的最大内存分配是如何分配给应用程序的。我有一个运行在Windows2008服务器上的应用程序,它承载着大约60个虚拟托管服务器(即60个JVM)。每个托管服务器的最大堆设置为1024m。Windows配置了32 GB RAM

现在的问题是,如何为JVM分配最大内存?它是一次性完成的还是在增量增长的基础上完成的?如果一次性完成,Windows如何处理在32 GB RAM打包系统中托管我的应用程序的所有60台托管服务器


任何意见都非常感谢。谢谢。

JVM最初分配通过
-Xms
选项指定的内存量(据我所知,默认值为32M)。当内存用完时,它将开始递增地分配新内存,直到达到通过
-Xmx
选项指定的数量(默认值为64M)

发生这种情况时,将抛出
OutOfMemory
错误


当然,这是一个相当简化的算法。事实上,JVM使用的是一个更复杂的值。

如果您希望在启动进程时分配它,您需要提供-Xms,如果您只提供-Xmx,VM将增长到该值,但在需要更多内存时只会增加。

-Xmx参数指定JVM可以使用的最大内存,但它不会在启动后立即从操作系统中分配它。它以增量的方式进行操作,通常是在许多步骤中,因为它需要这样做(即JVM中的Java应用程序在运行时需要更多的内存)


当然,这是默认行为,它可以用许多其他JVM参数更改。

JVM实际上在启动时分配
-Xmx
请求的所有内存,以及用于保存JVM可执行文件和内部工作区的额外内存。当您创建线程时,它还为这些线程使用的堆栈分配内存

这是因为(1)JVM实际上不使用这个内存,(2)操作系统提供了一个分页文件。当JVM请求分配时,它会创建操作系统的承诺,但实际上并不使用所有请求的RAM。由于实际使用RAM,操作系统将与页面文件交换页面。如果所有进程都在积极地使用它们的RAM,操作系统就必须不断地交换页面;这叫做“鞭打”


-Xms
参数指定总体堆大小内的初始堆大小。JVM将尝试将内存保持在这些界限内,但如果无法回收足够的垃圾,则允许扩展界限。但是,这些堆的增加不会以增量方式从操作系统请求更多内存。如果他们这样做了,堆将被碎片化,大数组分配可能会失败(因为它不适合连续内存)。

1024k(=1M)堆是一个打字错误吗?这意味着您的60台服务器仅使用60 MB,这似乎非常高效……)我的错!这确实是一个错误。