我知道Java VM有“-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堆进行“严格 调整”(不多也不少)?
答案 0 :(得分:4)
我相信JVM会按照您的意图管理堆,但是您的示例中的问题是最大堆大小实际上被忽略为太低。
在Sun的Windows JVM版本1.6.0_06上,我认为最小'最大堆大小'大约是6MB(即-Xmx6m)。如果您尝试设置较低,那么堆可能实际上变大。 (我原以为最小值是16米,但是一些实验表明,低至6米的值似乎有效。)
但是,如果你设置-Xms8m和-Xmx8m,我认为你会发现堆保持这个大小。
答案 1 :(得分:0)
还有其他选项以及-Xmx和-Xms来确定初始堆大小。查看jvm tuning guide了解详情。
答案 2 :(得分:0)
我猜它太小了。尝试更高的东西,比如16米或64米。此外,内部和外部尺寸是不同的鞋子。堆不会一直都是满的,因此总是可以小于Xmx,即使程序刚刚启动,也小于Xms。但在外部,你会看到已分配了Xms的内存量。
答案 3 :(得分:0)
当我第一次阅读时,我认为它说2 GB;)
不要忘记Java使用至少10 - 30 MB的非堆空间,因此您保存的几百K可能没有您想象的那么多。
答案 4 :(得分:-1)
据我所知,使用标准VM无法做到这一点。不幸的是,我现在手头没有参考资料。