我创建一个类,Main包含这样的主要方法:
public class Main {
public static void main(String[] _args) {
System.out.println("free:" + Runtime.getRuntime().freeMemory()
+ ". max:" + Runtime.getRuntime().maxMemory());
}
}
然后我用-Xms2m和-Xmx2m运行该类。输出是这样的:
free:2984840. max:7471104
然后,我的问题是,如果兆字节是1048576字节,那么显示的空闲内存不是-Xms中设置的2兆字节。当我将-Xms选项增加到3m时,它会显示一个兆字节的免费添加。任何人都可以解释发生了什么,。?
-Xmx选项出现不同情况,当我将其增加到3m,4m和5m时,最大值显示为7471104,大约为71.44m。我真的不明白这两个选项是如何运作的。
这是我设置-Xms3m和-Xmx6m
时打印的内容free:4033416. max:7471104
任何人都可以提供帮助,?
谢谢你:)注意:我正在使用Win7 x64和Java 1.6更新35。
答案 0 :(得分:1)
JVM在如何分配内存方面存在限制,这一点并不明显。这意味着它只需要将您提供的尺寸作为提示,然后严格遵循它。对于非常小的内存大小,这些差异更为显着,但即使你要求20 GB,它也不会精确到字节的20 GB。
答案 1 :(得分:0)
堆不仅包含应用程序分配的数据,还包含VM分配的对象(例如,表示类的对象)。 Hotspot VM足迹肯定比您设置为最大堆大小的要大。这就是实际堆大小更大的原因。