【问题标题】:Java heap /pool sizeJava 堆/池大小
【发布时间】:2012-07-26 19:54:04
【问题描述】:

当我启动 JVM 时,它至少会保留 {{xms}} 内存,对吗?这意味着这个内存对于 JVM 进程是私有的(它是 malloced),是吗? 当 JVM 需要在保留(mallocs)更多内存时增加堆。但是多少钱? 我不相信它会完全保留所需的量,可能存在一定的步长(池?)大小。

如何配置这个“步长”?

在达到 {{xmx}} 并抛出 OOM 之前,这一切都会发生,对吧?

JVM什么时候启动GC?不是涉及到 xml,而是涉及到保留的堆大小(这个池的顶部)?

如果是这样,最好将xms设置为接近xmx,以防止许多无用的GC。 我将有一个巨大的 GC 而不是很多小的 GC,每个 GC 的错误都会冻结我的 JVM,所以最好有一个,对吗?

【问题讨论】:

    标签: java garbage-collection jvm jvm-hotspot jvm-arguments


    【解决方案1】:

    当 JVM 需要增加堆以保留(malloc)更多内存时。但是多少钱?

    你不应该真的在乎。它只是工作。许多建议使用相等的XmxXms,以便JVM 在启动时分配所有内存。这是合理的,请进一步阅读。

    如何配置这个“步长”?

    它不能,它完全是实现并且可能依赖于操作系统。

    JVM什么时候启动GC?不是涉及到 xml,而是涉及到保留的堆大小(这个池的顶部)?

    GC 比你想象的要复杂一些。 Minor GC 在 young generation 被填满时执行。 Major GC 被称为 old generation 没有更多空间了。

    在达到 {{xmx}} 并抛出 OOM 之前,这一切都会发生,对吧?

    不,当达到Xmx 时,JVM 会稳定下来,不会发生任何错误。 OutOfMemoryError 在 GC 之后立即抛出,JVM 无法为新对象找到足够的空间(这是一个主要的简化)。

    如果是这样,最好将xms设置为接近xmx,以防止许多无用的GC。

    再一次,您必须了解 GC 的工作原理。使用等于XmsXmx 是一个不错的选择,因为它可以避免在应用程序运行时进行不必要的分配(一切都发生在启动时,没有进一步的开销)。 GC与此无关。

    每个 GC 都会冻结我的 JVM,而不是很多小错误,所以最好有一个,对吧?

    不。 Minor GC 通常需要几十毫秒并且几乎是不可见的,除非您在实时系统上工作。 Major (stop-the-world) GC 可能需要几秒钟,并且对于最终用户来说肯定是显而易见的。在经过正确调整的 JVM 中,major GC 应该很少发生。

    【讨论】:

    • 关于次要与主要集合只需确保您的 -Xmn 即您的伊甸园与终身堆的比率不会太小。我认为默认是 1:3,但我通常更喜欢 1:10。但这完全取决于您的应用程序。
    【解决方案2】:

    你对开关的含义是正确的。

    我记得开关的方式是

    xm*s* = 以“s”结尾,如“*s*tarting memory”。

    xm*x* = 以“x”结尾,如“ma*x*imum memory”

    由给定的 JVM 决定如何从起始内存移动到最大内存。假设这两者不是很接近,分配将在我知道的所有 JVM 上逐步进行。

    我不知道有任何选项可以控制任何 JVM 中的步骤大小。当然没有标准选项。

    不同的 JVM 有不同的 GC 策略。一些 JVM 允许您使用由命令行开关控制的多种 GC 策略之一。

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 2013-01-26
      • 2017-08-21
      • 2016-04-25
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多