0

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

如何配置这个“步长”?

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

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

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

4

2 回答 2

5

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

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

如何配置这个“步长”?

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

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

GC 比你想象的要复杂一些。当年轻代被填满时执行 Minor GC 。Major GC 称为老年代没有剩余空间。

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

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

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

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

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

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

于 2012-07-26T20:05:08.383 回答
0

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

我记得开关的方式是

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

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

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

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

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

于 2012-07-26T20:03:57.637 回答