代码之家  ›  专栏  ›  技术社区  ›  Manuel Selva

JVM堆参数

  •  64
  • Manuel Selva  · 技术社区  · 15 年前

    在阅读了关于这个主题的问题和大量的谷歌搜索之后,我仍然无法清晰地看到 XMS 选项

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

    目前我有以下答案:

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

    以下是我给出这个答案的原因:

    设置 -Xms 选择权 512m 不会导致我的应用程序使用 512M 启动后的物理内存。我想这与现代操作系统虚拟内存管理和惰性页面分配有关。(我注意到设置 XMS 512m 64M 在Linux上Top或Windows上的任务管理器报告的初始使用内存完全没有变化)

    有人能帮我理解这件事的影响吗 Xms 选择还是指向有助于我理解的链接?

    提前谢谢

    马努

    6 回复  |  直到 7 年前
        1
  •  34
  •   Burkhard    11 年前

    要总结链接后找到的信息,请执行以下操作: JVM分配由-xms指定的数量,但是操作系统通常在需要时才分配真正的页面。因此,JVM按照XMS指定的方式分配虚拟内存,但只根据需要分配物理内存。

    在Windows上,您可以通过SysInternals而不是任务管理器使用ProcessExplorer来看到这一点。

    所以在使用-xms64m和-xms512m之间有一个真正的区别。 但我认为最重要的区别是您已经指出的一点:如果您确实需要512MB,垃圾收集器的运行频率会更高,但只从64MB开始。

        2
  •  35
  •   Burkhard    11 年前

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

    所以,

    • -XMS512M-XMX512M

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

    • -XMS64M-XMX512M

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

        3
  •  14
  •   icedwater    11 年前

    除了标准堆参数 -Xms -Xmx 也很高兴知道 -XX:PermSize -XX:MaxPermSize ,用于指定perm gen空间的大小,因为即使在堆中的其他代中可以有空间,但如果perm gen空间已满,则可能会耗尽内存。这个链接也有一些很好的概述 important JVM parameters .

        4
  •  5
  •   bajafresh4life    15 年前

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

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

    就JVM实际从操作系统请求内存而言,我相信这取决于JVM的平台和实现。我想在你的应用真正需要它之前它不会请求内存。-xmx和-xms只是保留内存。

        5
  •  4
  •   Burkhard    11 年前

    如果你写道: -XMS512M-XMX512M 当启动时,Java在RAM的512M时刻分配进程,不能增加。

    -XMS64M-XMX512M 当它启动时,Java只为其进程分配了6M RAM,但是Java可以在512M的范围内增加他的内存占用。

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

        6
  •  0
  •   Akavall    7 年前

    我在年创造了这个玩具的例子。 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 版本。我肯定短暂的暂停是垃圾收集运行,而长的暂停是堆分配。