Java-Xms和-Xmx测试

Java-Xms和-Xmx测试,java,memory,jvm,runtime,Java,Memory,Jvm,Runtime,我创建了一个类Main,它包含如下Main方法: public class Main { public static void main(String[] _args) { System.out.println("free:" + Runtime.getRuntime().freeMemory() + ". max:" + Runtime.getRuntime().maxMemory()); } } free:2984840. max:7471104

我创建了一个类Main,它包含如下Main方法:

public class Main {

    public static void main(String[] _args) {
    System.out.println("free:" + Runtime.getRuntime().freeMemory()
        + ". max:" + Runtime.getRuntime().maxMemory());
    }
}
free:2984840. max:7471104
然后我用-Xms2m和-Xmx2m运行这个类。输出如下:

public class Main {

    public static void main(String[] _args) {
    System.out.println("free:" + Runtime.getRuntime().freeMemory()
        + ". max:" + Runtime.getRuntime().maxMemory());
    }
}
free:2984840. max:7471104
然后,我的问题是,如果一个兆字节是1048576字节,那么显示的空闲内存就不是-Xms中设置的2M兆字节。当我将-Xms选项增加到3m时,它显示了一个兆字节的空闲加法。任何人都可以解释发生了什么

使用-Xmx选项时会出现另一种情况,当我将其增加到3m、4m和5m时,最大值始终显示为7471104。大约71.44米。我真的不明白这两个选项是如何工作的

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

free:4033416. max:7471104
任何人都可以帮忙

谢谢:)


注意:我使用的是Win7 x64和Java 1.6 update 35。

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

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

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

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

考虑这种行为是因为分配的堆太小。此外,最好使用和VisualGC插件进行监视。因为Runtemie方法的行为应该取决于JVM实现。我同意@Taky,我为我的应用程序设置了更大的值:-Xms100M-Xmx1500M,打印结果如下:free:99129720。max:1520435200您能试试8、16、256、512这样的尺寸吗?我设置了-Xms8m和-Xmx8m,结果:免费:7834504。麦克斯:8060928。考虑一下这种行为,因为你分配的堆太小了。此外,最好使用和VisualGC插件进行监视。因为Runtemie方法的行为应该取决于JVM实现。我同意@Taky,我为我的应用程序设置了更大的值:-Xms100M-Xmx1500M,打印结果如下:free:99129720。max:1520435200您能试试8、16、256、512这样的尺寸吗?我设置了-Xms8m和-Xmx8m,结果:免费:7834504。最大值:8060928。正在使用2mb、3mb、4mb设置Xmx,。。。显示最大约7mb。那为什么8mb正好显示8mb呢,。?如果将Xmx设置为2mb将显示2mb+额外空间,为什么8mb正好显示8mb,。?隐马尔可夫模型,。。仍然不知道,…您可以将
jmap
-gcutil
-gccapacity
一起使用吗。这将显示每个堆区域的确切大小/占用情况。这比调用
freemory()/maxMemory
更可靠,。。。显示最大约7mb。那为什么8mb正好显示8mb呢,。?如果将Xmx设置为2mb将显示2mb+额外空间,为什么8mb正好显示8mb,。?隐马尔可夫模型,。。仍然不知道,…您可以将
jmap
-gcutil
-gccapacity
一起使用吗。这将显示每个堆区域的确切大小/占用情况。这比调用
freemory()/maxMemory
更可靠。