JVM堆参数

时间:2009-07-08 14:33:22

标签: java jvm-arguments

在阅读了有关该主题的问题和大量谷歌搜索后,我仍然无法清楚地了解 -Xms 选项

我的问题是:java -Xms=512m -Xmx=512mjava -Xms=64m -Xmx=512m之间有什么区别?

现在我有以下答案:

唯一的区别在于在我的应用程序运行期间将运行的垃圾收集的数量和内存分配的数量。我是对的吗?

以下是我回答这个问题的原因:

-Xms选项设置为512m不会导致我的应用程序在启动后使用真正的512M物理内存。我想这与现代操作系统虚拟内存管理和延迟页面分配有关。 (我注意到将-Xms设置为512M64M并未改变Linux上的top或Windows上的任务管理器报告的所有初始使用内存

有人可以帮我理解这个Xms选项的影响,还是指点一些有助于我理解它的链接?

提前致谢

马努

6 个答案:

答案 0 :(得分:35)

JVM将从初始堆级别的内存使用开始。如果maxheap更高,它将增长到maxheap大小,因为内存要求超过了它的当前内存。

所以,

  • -Xms512m -Xmx512m

JVM以512 M开始,从不调整大小。

  • -Xms64m -Xmx512m

JVM以64M开始,如果mem,则增长(最大上限为512)。要求超过64。

答案 1 :(得分:34)

总结链接后找到的信息: JVM分配-Xms指定的数量,但OS通常不会在需要之前分配实际页面。因此,JVM按照Xms的指定分配虚拟内存,但只根据需要分配物理内存。

您可以通过Sysinternals使用Process Explorer代替Windows上的任务管理器来查看此内容。

因此使用-Xms64M和-Xms512M之间存在真正的区别。 但我认为最重要的区别就是你已经指出的那个:如果你真的需要512MB而垃圾收集器会更频繁地运行,但只能以64MB开始。

答案 2 :(得分:14)

除了标准的堆参数-Xms-Xmx之外,了解-XX:PermSize-XX:MaxPermSize也很有用,它用于指定Perm Gen空间的大小,因为即使你如果你的perm gen空间变满,你可以在堆中的其他代中拥有空间,你可以耗尽内存。此链接还概述了一些important JVM parameters

答案 3 :(得分:5)

JVM自适应地调整堆大小,这意味着它将尝试为您的应用程序找到最佳堆大小。 -Xms和-Xmx只是指定JVM可以操作的范围并调整堆的大小。如果-Xms和-Xmx是相同的值,则JVM的堆大小将保持不变为该值。

通常最好只设置-Xmx并让JVM找到最佳的堆大小,除非有一个特定的原因,你需要在JVM启动时给JVM一个大堆。

当JVM实际从OS请求内存时,我认为它取决于JVM的平台和实现。我想在你的应用实际需要之前它不会请求内存。 -Xmx和-Xms只保留内存。

答案 4 :(得分:4)

如果你写道: -Xms512m -Xmx512m 当它启动时,java在那个时刻分配512m的ram用于他的进程并且不能递增。

-Xms64m -Xmx512m 当它启动时,java为他的进程只分配了64m的ram,但java可以在512m时增加他的内存占用。

我认为第二件事情更好,因为你给了java自动内存管理。

答案 5 :(得分:0)

我在my_file.scalaobject MyObject { def main(args: Array[String]) { var ab = ArrayBuffer.empty[Int] for (i <- 0 to 100 * 1000 * 1000) { ab += i if (i % 10000 == 0) { println("On : %s".format(i)) } } } }

中创建了这个玩具示例
scala -J-Xms500m -J-Xmx7g my_file.scala

我用它来运行:

scala -J-Xms7g -J-Xmx7g my_file.scala

-Xms500m

<?php $host = $_SERVER['HTTP_HOST']; preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches); echo "domain name is: {$matches[0]}\n"; ?> 版本中肯定有明显的暂停。我很肯定短暂的暂停是垃圾收集运行,而长期暂停是堆分配。