Java -Xms和-Xmx测试

时间:2013-02-03 04:52:10

标签: java memory jvm runtime

我创建一个类,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。

2 个答案:

答案 0 :(得分:1)

JVM在如何分配内存方面存在限制,这一点并不明显。这意味着它只需要将您提供的尺寸作为提示,然后严格遵循它。对于非常小的内存大小,这些差异更为显着,但即使你要求20 GB,它也不会精确到字节的20 GB。

答案 1 :(得分:0)

堆不仅包含应用程序分配的数据,还包含VM分配的对象(例如,表示类的对象)。 Hotspot VM足迹肯定比您设置为最大堆大小的要大。这就是实际堆大小更大的原因。