【问题标题】:Starting memory allocation for JVM开始为 JVM 分配内存
【发布时间】:2010-04-29 17:46:51
【问题描述】:

我开始在java 命令上使用-Xmx 选项,以允许我的进程使用更多内存(256Mb,尽管我认为我目前使用的内存少于 128Mb)。我还注意到用于启动内存的-Xms 选项,默认值为2Mb。我应该将此值设置为什么以及为什么?


Reference: Java

【问题讨论】:

  • 我承认我懒得look it up,但我对此类问题的一般经验法则是:如果我不知道该选项有什么用处并且没有任何问题,我会放弃它照原样,相信设置默认值的人的良好意识。

标签: java jvm jvm-arguments


【解决方案1】:

-Xmx 参数定义了 JVM 堆可以达到的最大内存大小。您必须非常了解您的程序并查看它在负载下的性能并相应地设置此参数。如果程序的堆内存达到最大堆大小,较低的值可能会导致OutOfMemoryException 或性能非常差。如果您的程序在专用服务器上运行,您可以将此参数设置得更高,因为它不会影响其他程序。

-Xms 参数设置 JVM 的初始和最小堆内存大小。这意味着当您启动程序时,JVM 将立即分配此内存量。如果您的程序从一开始就消耗大量堆内存,这将非常有用。这避免了 JVM 需要定期增加堆大小,因此您可以获得一些性能。如果你不知道这个参数是否对你有帮助,请不要使用它。

对于像 Resin 这样的服务器端 Java 应用程序,最好将最小 -Xms 和最大 -Xmx 堆大小设置为相同的值。 您可以设置为 256 或 512Mb。

【讨论】:

  • 我的做法是,当我发现由于某种原因必须提高 mx 时,我让 ms 匹配它,因为它达到了那个限制(或者你不必提高 mx)。我不确定这是否重要,但如果你知道你将需要它,为什么不预先分配它呢?如果您不需要每次运行都使用高 mx,尽管您可能会将 ms 设置为低。
  • @Bill 是的,现在 RAM 是一种你可以扔进机器的东西。这更多是因为应用程序需要与其他应用程序配合得很好。如果你有内存,你可以预先把它交给 java。
  • 好吧,我的想法是假设你需要 ram 并且无论如何都必须使用你的 -mx 变量,那么你有 ram 可以使用 -ms 并且最终会需要它所以把它放在前面有什么负面影响?
  • @Bill。早些时候我们需要担心这个因素
【解决方案2】:

堆大小应该为您的应用程序找到正确的“正确”,但并不容易。如果它太小,你会耗尽内存,如果太大,你会浪费内存,并且会有长时间 GC 暂停的风险。当事情出错(而且总是出错)时,您拥有的堆越多,您需要调试的堆就越多,任何泄漏都需要越长的时间才能显现出来。

理想情况下,我会将-Xms 设置为我认为我的应用程序需要运行的大小,并将-Xmx 设置为大于此的值(但不要太大)。始终打开详细垃圾收集并绘制正在使用的堆以检查您设置的值。

当我绘制堆图表时,我会查看发生的集合数量和类型。重要的是不要有太多。然而,同样重要的是不要有一个太大以至于很少的堆,因为当它们发生时(并且完整的 gc 是不可避免的)它们会受到伤害。理想情况下,正在寻找一组间隔良好且暂停时间非常短的常规 gcs。

对于 32 位 Windows,-Xms 应该与 -Xmx 相同,这是因为 Java(撇开 jrockit 不谈)需要连续的内存,并且 Windows 的内存映射是碎片化的,因此获取并锁定堆是值得的尽早。

【讨论】:

    【解决方案3】:

    Xmx 是内存池的上限。 Xms 是初始大小。这就是它的全部。每个的适当大小将取决于您的应用程序的复杂性。将初始大小设置为高于 2mb 的主要优点只是 JVM 将花费更少的时间从操作系统请求更多内存。如果您设置了 256mb 的上限,那么 32mb-64mb 的初始大小对于大多数企业应用程序来说都不是不合理的。

    更多:http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html

    【讨论】:

      【解决方案4】:

      我应该将此值设置为什么以及为什么?

      当然取决于你的应用。

      如果您知道您的应用程序最初消耗最多,比如说第一分钟 64 mb,然后使用默认值 (2mb),将使 VM 多次请求内存,直到达到这个 64mb。这些内存请求会稍微减慢您的应用程序,因为垃圾收集器可能会在 VM 请求更多之前运行多次尝试释放空间。

      如果您已经知道将使用 64 mb 作为起始内存,则使用 -Xms 参数可以让您预先分配该内存。

      如果您消耗 128mb 并且您有足够的可用内存,您可以使用 java -Xms128m 并且不用担心长时间请求更多内存。

      但同样,这取决于您的应用程序做什么、如何使用内存以及何时需要。等等等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-24
        • 2013-07-27
        • 2016-06-01
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        相关资源
        最近更新 更多