2013-02-03 57 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'更可靠。 –