Java堆/池大小

时间:2012-07-26 19:54:04

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

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

如何配置此“步长”?

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

当JVM启动GC时?不是说xmx,而是保留堆大小(这个池的顶部)?

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

2 个答案:

答案 0 :(得分:5)

  

当JVM需要增加堆储备(mallocs)的内存时。但是多少钱?

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

  

如何配置此“步长”?

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

  

当JVM启动GC时?不是说xmx,而是保留堆大小(这个池的顶部)?

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

  

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

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

  

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

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

  

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

不。轻微GC通常需要几十毫秒而且几乎不可见,除非您正在使用实时系统。主要(停止世界)GC可能需要几秒钟,对于最终用户来说肯定是值得注意的。在正确调整的JVM中,主要的GC应该很少发生。

答案 1 :(得分:0)

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

我记得开关的方式是

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

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

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

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

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