如何确定Java堆的大小

如何确定Java堆的大小,java,heap,strict,sizing,Java,Heap,Strict,Sizing,我知道JavaVM有“-XMx”和“-XMs”来设置堆的大小。它还有一个称为“人体工程学”的特性,可以智能地调整堆的大小。但是,我手头有一个问题,要求堆具有严格固定的大小 以下是命令行参数: "-Xms2m -Xmx2m -XX:+PrintGCDetails" 但是,通过观察GC日志,堆的大小似乎没有固定在2048K。参见,例如2368K、2432K、2176K等: [GC [PSYoungGen: 480K->72K(704K)] 1740K->1332K(2368K), 0.

我知道JavaVM有“-XMx”和“-XMs”来设置堆的大小。它还有一个称为“人体工程学”的特性,可以智能地调整堆的大小。但是,我手头有一个问题,要求堆具有严格固定的大小

以下是命令行参数:

"-Xms2m -Xmx2m -XX:+PrintGCDetails"
但是,通过观察GC日志,堆的大小似乎没有固定在2048K。参见,例如2368K、2432K、2176K等:

[GC [PSYoungGen: 480K->72K(704K)] 1740K->1332K(2368K), 0.0032190 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC [PSYoungGen: 560K->64K(768K)] 2094K->1598K(2432K), 0.0033090 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC [PSYoungGen: 544K->32K(768K)] 1675K->1179K(2176K), 0.0009960 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

有没有办法对Java堆进行“严格的大小调整”(不多不少)

据我所知,使用标准VM是不可能的。不幸的是,我现在手头没有引用。

还有其他选项以及-Xmx和-Xms来确定初始堆大小。查看jvm以了解详细信息。

我相信jvm将按照您的意愿管理堆,但您的示例中的问题是,由于堆的最大大小太小,因此实际上忽略了它

在Sun的Windows JVM版本1.6.0_06上,我认为最小“最大堆大小”大约为6MB(即-Xmx6m)。如果尝试设置得更低,那么堆实际上可能会变大。(我原以为最小值是16m,但一点实验表明,低至6m的值似乎有效。)


但是,如果您设置-Xms8m和-Xmx8m,我想您会发现堆保持在该大小。

我想它太小了。试试更高的,比如16米或64米。此外,内部和外部尺寸是不同的鞋。堆不会一直充满,因此小于Xmx始终是可能的,即使在程序刚刚启动的情况下小于Xms也是可能的。但在外部,您将看到Xms内存量已经分配。

当我第一次读到它时,我认为它是2GB;)


别忘了Java使用了至少10-30 MB的非堆空间,因此您节省的几百K可能没有您想象的那么重要。

谢谢,Jan。如果没有简单的解决方法,我将不得不深入研究源代码。