1

我创建了一个 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

那么,我的问题是,如果 1 兆字节是 1048576 字节,那么显示的可用内存不是 -Xms 中设置的 2 兆字节。当我将 -Xms 选项增加到 3m 时,它显示免费添加兆字节。任何人都可以解释发生了什么,.?

-Xmx 选项会发生不同的情况,当我将其增加到 3m、4m 和 5m 时,最大值保持显示 7471104。大约是 71.44m。我真的不明白这两个选项是如何工作的。

这是我设置 -Xms3m 和 -Xmx6m 时打印的内容

free:4033416. max:7471104

任何人都可以帮助,.?

谢谢你 :)

注意:我正在使用 Win7 x64 和 Java 1.6 更新 35。

4

2 回答 2

1

JVM 在如何分配内存方面有限制,这并不明显。这意味着它仅将您提供的尺寸作为提示,并将尽可能严格地遵循。对于非常小的内存大小,这些差异更为显着,但即使您要求 20 GB,它也不会精确到 20 GB。

于 2013-02-03T08:52:16.663 回答
0

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

于 2013-02-03T09:01:26.097 回答