2013-02-03 59 views
1

我做的一类,主要包含这样的主要方法:Java的-Xms和-Xmx测试

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 

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

使用-Xmx选项会发生不同的情况,当我将它增加到3米,4米和5米时,最大值将继续显示7471104.这约为71.44米。我真的不明白这两个选项如何工作。

这个当我设置-Xms3m和-Xmx6m

free:4033416. max:7471104 

任何人都可以帮助是什么,是印刷,。?

谢谢:)

笔记:我与Win7的X64和Java 1.6更新35

+1

认为这种行为是因为你分配了一个太小的堆。此外,最好使用http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html和visual gc插件进行监控。因为Runtemie方法的行为应该依赖于JVM的实现。 – Taky

+0

我同意@Taky,我为我的应用程序设置了更大的值:-Xms100M -Xmx1500M和打印结果是这样的:免费:99129720。最大:1520435200 –

+0

你可以尝试像8,16,256,512的大小? –

回答

1

的JVM在内存如何分配这不是很明显的限制方面的工作。这意味着它只会将您提供的尺寸作为一种暗示,并将严格按照它的规定进行处理。对于非常小的内存大小,这些差异更加显着,但即使您要求20 GB,也不会精确到字节的20 GB。

+0

感谢您的每一个回应。 :) – simaremare

0

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

+0

设置XMX与2MB,3MB,4MB,...表明,最高约7MB。那么为什么如果8MB显示正好8mb,。?如果将Xmx设置为2mb将显示2mb +额外的空间,为什么8mb恰好显示8mb,。?嗯,..仍然不知道,.. – simaremare

+0

可以使用'jmap'加'-gcutil'和'-gccapacity'。这会显示每个堆区的确切大小/占用情况。这比调用'freeMemory()/ maxMemory'更可靠。 –