3

虽然这个问题非常基础,但我愿意了解 JVM 的最大内存分配是如何分配给应用程序的。我有一个运行在 Windows 2008 服务器上的应用程序,该服务器托管大约 60 个虚拟托管服务器 [即 60 个 JVM]。每个托管服务器设置的最大堆为 1024m。Windows 配置有 32 GB RAM。

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

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

4

4 回答 4

3

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

这是有效的,因为 (1) JVM 实际上并不使用该内存,并且 (2) 操作系统提供了一个分页文件。当 JVM 请求分配时,它由操作系统创建一个承诺,但实际上并没有使用所有请求的 RAM。由于它实际使用 RAM,操作系统将在页面文件之间交换页面。如果所有进程都在积极使用它们的 RAM,操作系统将不得不不断地交换页面;这被称为“颠簸”。

-Xms参数指定初始堆大小,在整体堆大小内。JVM 将尝试将内存保持在这些范围内,但如果它无法回收足够的垃圾,则允许扩大范围。但是,这些堆的增加并不会逐渐向操作系统请求更多内存。如果他们这样做了,堆就会碎片化,并且大型数组分配可能会失败(因为它不适合连续内存)。

于 2013-02-06T15:26:25.407 回答
1

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

发生这种情况时,OutOfMemory将引发错误。

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

于 2013-02-06T15:16:41.923 回答
1

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

于 2013-02-06T15:17:23.090 回答
1

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

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

于 2013-02-06T15:19:52.267 回答