66

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

java -Xms=512m -Xmx=512m我的问题是:和有什么区别java -Xms=64m -Xmx=512m

现在我有以下答案:

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

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

-Xms选项设置为512m不会导致我的应用程序512M在启动后使用真正的物理内存。我想这与现代操作系统虚拟内存管理和惰性页面分配有关。(我注意到无论是 Linux 上的 top 还是 Windows 上的任务管理器报告的初始使用内存,设置-Xms512M或 to64M都没有改变)

有人可以帮助我了解此Xms选项的影响或指向有助于我理解它的链接吗?

提前致谢

马努

4

6 回答 6

38

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

所以,

  • -Xms512m -Xmx512m

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

  • -Xms64m -Xmx512m

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

于 2009-07-08T14:40:50.017 回答
34

总结链接后找到的信息: JVM 分配 -Xms 指定的数量,但操作系统通常不会分配实际页面,直到需要它们。因此 JVM 分配 Xms 指定的虚拟内存,但仅根据需要分配物理内存。

您可以通过使用 Sysinternals 的 Process Explorer 而不是 Windows 上的任务管理器来查看这一点。

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

于 2009-07-08T14:45:28.790 回答
15

除了标准的堆参数之外,了解-Xms-Xmx也很好-XX:PermSize-XX:MaxPermSize它用于指定 Perm Gen 空间的大小,因为即使您可以在堆中的其他代中拥有空间,如果您的 perm gen 空间已满,您也可能会耗尽内存。这个链接也很好地概述了一些重要的 JVM 参数

于 2011-11-20T03:50:18.037 回答
5

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

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

至于 JVM 何时实际向操作系统请求内存,我相信这取决于 JVM 的平台和实现。我想在你的应用真正需要它之前它不会请求内存。-Xmx 和 -Xms 只是保留内存。

于 2009-07-08T14:43:52.693 回答
4

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

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

我认为第二件事更好,因为您为 java 提供了自动内存管理。

于 2009-07-08T14:38:36.400 回答
0

scala我在,中创建了这个玩具示例my_file.scala

object 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。我很肯定短暂停是垃圾收集运行,而长暂停是堆分配。

于 2017-01-11T20:43:57.277 回答