我注意到Java堆分配是2 MB的倍數。例如,我用-Xmx values as 1021m, 1022m
啓動JVM,兩個JVM都以1022m
的堆大小啓動。同樣堆大小1023m,1024m
開始於1024m
。Java堆分配是2MB的倍數
的輸出是下面:
C:\Users\myuser>java -Xmx1021m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1022m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
在這兩種情況下它顯示了作爲MaxHeapSize字節1071644672這是1022mb。
C:\Users\myuser>java -Xmx1023m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1024m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
在這兩種情況下,它都顯示MaxHeapSize爲1073741824字節,即1024mb。
此行爲與Xms類似。
問題1:爲什麼堆大小從指定值更改爲2的下一個倍數?
問題2:爲什麼Java不連警告我們當JVM實際上已經比規定
問題3的一個不同的值開始:有沒有標誌或某種方式來迫使JVM創建的堆1021mb?
問題4:在假設的情況下,我說我的機器上有1023mb的可用內存,我嘗試用1023mb的堆創建一個JVM。通過上面的行爲,它實際上試圖從1024MB開始,這是不可用的。 JVM創建失敗?
我想這是你的操作系統而不是JVM的限制:操作系統通常有一個「內存頁面」的概念 - 分配給處理的最小物理內存量。每個進程可以有多個頁面,但不能少於一頁。您的操作系統恰好具有2MB的頁面大小。 –
@ M.Prokhorov你的評論幾乎是正確的,唯一的改正是少量的*虛擬*內存。簡化內存頁面 - 虛擬內存框架 - 物理。 – Eugene
@Eugene如何在windows和linux上獲得虛擬內存的最小數量? –