深入理解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最大內存分配
總結
以上是生活随笔為你收集整理的深入理解Java堆内存分配策略(Xmx和Xms)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.lang.NoClassDef
- 下一篇: intellij运行flink的word