64位java 1.7是否忽略最小堆大小标志?

时间:2012-03-15 23:00:48

标签: java memory-management 64-bit

java -Xms显然没有影响java进程在运行期间消耗的内存量。

从系统的角度来看,我的应用程序消耗大约1Gb。我尝试设置-Xms2048m(和-Xmx4096m),我看到内存消耗绝对没有变化。

热点文档声称堆大小低于Xms值或默认值。

我唯一能想到的可能是进程无法获取连续的内存块,所以它抓住了所有可能的内容然后稍后会分配更多内容,或者Windows可能不会让它开始拥有那么多内存。 (64位窗口7)

(我不需要任何东西,这只是我注意到的好奇心)

3 个答案:

答案 0 :(得分:2)

默认的内存使用情况窗口任务管理器显示您不是在进程虚拟内存空间中分配的内容。这个过程实际上写入了必须映射到实际内存的虚拟空间中的程度。如果在任务管理器中启用“提交大小”列,则会从进程的虚拟地址空间的角度显示实际被视为“已使用”的内容。 (大致是Xms + permsize + VM和系统内容的大小。)

答案 1 :(得分:1)

对于Java 1,请尝试使用-ms-mx

从Java2开始,您可以使用-Xms-Xmx

我的经验是,-ms和`-mx也适用于Java2。见http://www.devx.com/tips/Tip/5578

答案 2 :(得分:0)

JVM需要堆的连续内存区域。这意味着它在启动时将最大大小分配为虚拟内存。这并不像听起来那么糟糕,因为操作系统只在使用它时将主内存分配给应用程序(而不是在分配虚拟内存时)

如果查看VisualVM等工具中使用的内存量,您会发现即使开销为150 - 500 MB,其大小也会小于最小大小。这是因为如果Java没有用它,它不会只使用最小大小。

相反,最小尺寸是低于它的次数,它只会轻微地尝试清理内存。 (您可能会看到它执行较小的GC)在大多数情况下,这意味着应用程序将非常快速地使用最小大小。但是,“hello world”程序不会使用最小尺寸。

  

也许Windows不会让它有很多内存开始

如果JVM无法将最大大小分配为连续块,则JVM将无法启动。 (这是32位窗口的常见问题,因此限制可能是1.5 GB或低至1.2 GB)