2017-05-05 111 views
1

當我用下面的配置上運行HotSpot虛擬機我的Java應用程序: -Xms2048m-Xmx2048m,則JMAP輸出:Hotsot JVM選項

Heap Configuration: 
    MinHeapFreeRatio = 40 
    MaxHeapFreeRatio = 70 
    MaxHeapSize  = 2147483648 (2048.0MB) 
    NewSize   = 1310720 (1.25MB) 
    MaxNewSize  = 17592186044415 MB 
    OldSize   = 5439488 (5.1875MB) 
    NewRatio   = 2 
    SurvivorRatio = 8 
    PermSize   = 21757952 (20.75MB) 
    MaxPermSize  = 85983232 (82.0MB) 

Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 706740224 (674.0MB) 
    used  = 364788568 (347.88948822021484MB) 
    free  = 341951656 (326.11051177978516MB) 
    51.61565107124849% used 
From Space: 
    capacity = 4587520 (4.375MB) 
    used  = 1900560 (1.8125152587890625MB) 
    free  = 2686960 (2.5624847412109375MB) 
    41.428920200892854% used 
To Space: 
    capacity = 4456448 (4.25MB) 
    used  = 0 (0.0MB) 
    free  = 4456448 (4.25MB) 
    0.0% used 
    ... 

是什麼讓我困惑是爲什麼的伊甸空間和兩個倖存者空間容量不服從式

eden/(s0+s1) = SurvivorRatio

但是,當我添加anthor JVM選項-Xmn500m,則JMAP輸出似乎是合理的,即容量服從公式嚴格

回答

0

我希望這會得到更多的關注......事實上你是對的(這是不是一個答案 - 但太長評論)

當我這樣做:

java -XX:+PrintFlagsFinal | grep SurvivorRatio 
     uintx InitialSurvivorRatio      = 8 

顯然,這是。但是當測試它的行爲更像一個(我不能再現你與jdk-8看到的巨大差異)。

下面是相關的部分與-Xmx2048m -Xms2048m

PS Young Generation 
Eden Space: 
capacity = 537395200 (512.5MB) 
.... 
From Space: 
capacity = 89128960 (85.0MB) 
.... 
To Space: 
capacity = 89128960 (85.0MB) 

運行時:

八十五分之五百十二隻要我跑= 6

與之相同的代碼-Xmx2048m -Xms2048m,但添加默認值-XX:SurvivorRatio = 8;輸出爲:

PS Young Generation 
Eden Space: 
capacity = 573046784 (546.5MB) 
.... 
From Space: 
capacity = 71303168 (68.0MB) 
.... 
To Space: 
capacity = 71303168 (68.0MB) 

546.5/68 = 8

這同樣適用於-Xmn真 - 您正在設置。這很奇怪!我並沒有改變的SurvivorRatio的價值 - 它仍然是相同的默認8

看來,國內也有一些檢查是否涉及到SurvivorRatio計算標誌被設置和應用不同的策略(我希望我知道了這些內在的東西,但沒有運氣)。

男孩!我是否試圖找到這些。我確實發現東西暗示朝着那,但不直接回答,像thisthis(特別是評論)。我做了:

grep -R "SurvivorRatio" . 

hotspot源內部局部且仍在到底是怎麼回事的所有結果沒有提示。


唯一合乎邏輯的解釋,我必須在這個時間點,是除非指定相關SurvivorRatio任何參數;會選擇一個默認值(不一定是由java -XX:+PrintFlagsFinal報告的值),但是中間的東西,接近於此。如果是這種情況,則應在文檔中明確指定;否則在我的世界中這是一個小文檔錯誤。

+0

我發現了與這個問題有關的源代碼。我認爲這可能會有所幫助。 [psYoungGen.cpp](https://github.com/JetBrains/jdk8u_hotspot/blob/master/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp)。從第108行到第144行 –