当我启动JVM时,它至少保留{{xms}}个内存,对吧?这意味着这个内存对于JVM进程是私有的(它是malloced),是吗? 当JVM需要增加堆储备(mallocs)的内存时。但是多少钱? 我不相信它能够保留所需的数量,可能有一定的步骤(池?)大小。
如何配置此“步长”?
所有这一切都会发生,直到达到{{xmx}}并抛出OOM,对吧?
当JVM启动GC时?不是说xmx,而是保留堆大小(这个池的顶部)?
如果是这样,最好将xms设置为接近xmx以防止许多无用的GC。 我会有一个巨大的GC而不是很多小的,每个GC冻结我的JVM的bug,所以最好有一个,对吧?
答案 0 :(得分:5)
当JVM需要增加堆储备(mallocs)的内存时。但是多少钱?
你不应该真的在意。它只是工作。许多建议使用相等的Xmx
和Xms
,以便JVM在启动时分配所有内存。这是合理的,请进一步阅读。
如何配置此“步长”?
它不能,它完全是实现,可能依赖于操作系统。
GC比你想象的要复杂一点。当年轻代被填满时执行次要GC。主要GC被称为老一代中没有剩余空间。当JVM启动GC时?不是说xmx,而是保留堆大小(这个池的顶部)?
所有这一切都会发生,直到达到{{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策略之一,由命令行开关控制。