例子:-Xmx=512M -Xms=64M
Java堆可以通過Xmx和Xms兩個參數指定最大內存512M,最小內存64M。以下為兩個常見疑問:
1. 既然都指定了 Xmx 為什么還要設置 Xms 呢?
Xms 是必不可少的配置,Xms 是 GC 算法進行垃圾收集評判標准中一個必不可少的元素。另外-Xms和-Xmx設置相同時可避免Java堆自動擴展。
2. Xmx 指定的最大 Java 堆內存是在 Java 進程啟動的時候直接一次性分配還是隨着堆內存消耗不斷增加直到 Xmx?
Xmx的內存是在Java進程啟動的時候直接分配(預留)的,而不是不斷增加的。因為大部分 GC 算法依賴於被分配為連續的內存塊的堆,因此不能在堆需要擴大時再分配更多本機內存。所有堆內存必須預先保留。
對於例子中的Xmx=512M是直接預留出512M的內存空間,但啟動時的Java進程並不一定全部使用,但512M是它的“領地”。
注意:
1. 對於問題2的提問其實有錯誤,Xmx指定內存並不是真正的分配,而是一種保留,內存保留 != 內存分配。當本機內存被保留時,無法使用物理內存或其他存儲器作為備用內存。盡管保留地址空間塊不會耗盡物理資源,但會阻止內存被用於其他用途。由保留從未使用的內存導致的泄漏與泄漏分配的內存一樣嚴重。
相關博文: