2012-07-26 134 views
0

当我启动JVM时,它至少保留{{xms}}内存,对吗?这意味着这个内存对于JVM进程来说是私有的(它是malloced),是吗? 当JVM需要增加堆(malloc)更多的内存时。但多少? 我不相信它保留完全一样多,因为它可能有一定的步骤(池?)大小。Java堆/池大小

如何配置“步长”?

直到达到{{xmx}},OOM被抛出的所有事情,对吗?

当JVM启动GC时?不是当涉及到xmx,而是涉及到保留堆大小(此池的顶部)?

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

回答

0

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

记得开关的方式是

XM * 小号以 “s” 像 “* 小号 * tarting存储器” * =完。

XM * X * =以“X”状端部“马* X * imum记忆”

它是由一个给定的JVM来决定如何从起始内存移动到最大记忆。假设两者并不平凡,彼此之间的分配将在我意识到的所有JVM的步骤中发生。

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

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

5

当JVM需要增加堆(mallocs)更多的内存时。但多少?

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

如何配置“步长”?

它不能,它是完全实现,可能与操作系统有关。

当JVM启动GC时?不是当涉及到xmx,而是涉及到保留堆大小(此池的顶部)?

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

直到达到{{xmx}}并且引发OOM的所有事情,对吧?

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

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

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

代替许多小孩,每个GC都会冻结我的JVM,所以最好有一个,对吗?

没有。小GC通常需要几十毫秒,几乎看不见,除非您正在实时系统上工作。主要(停止世界)GC可能需要几秒钟,对于最终用户来说肯定是显而易见的。在正确调优的JVM中,主要的GC应该很少出现。

+0

关于未成年人和主要收藏品,只要确保你的-Xmn即你的伊甸园占有率不太小。我认为默认值是1:3,但我通常更喜欢1:10。但这完全取决于您的应用程序。 – ddd 2012-07-27 21:31:00