深入理解Java堆內存分配策略(Xmx和Xms)


例子:-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指定內存並不是真正的分配,而是一種保留,內存保留 != 內存分配當本機內存被保留時,無法使用物理內存或其他存儲器作為備用內存。盡管保留地址空間塊不會耗盡物理資源,但會阻止內存被用於其他用途。由保留從未使用的內存導致的泄漏與泄漏分配的內存一樣嚴重。

相關博文:

1.【原創】Java進程的內存使用情況

2.【原創】Java進程內存消耗情況

3.【原創】修改WorkShop最大內存分配


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM