2015-11-05 47 views
4

這裏是jmap -heap命令的輸出:G1垃圾收集器:爲什麼倖存者空間總是滿的?

Survivor Space: 
    regions = 52 
    capacity = 54525952 (52.0MB) 
    used  = 54525952 (52.0MB) 
    free  = 0 (0.0MB) 
    100.0% used 

我已經執行了很多次,我發現capacity值常是等於used

我的問題是,爲什麼生存空間常是滿(等小)?我已指定-Xmx2200m -Xms2200m -Xmn1100m。 (我預計生存空間應該是220M,這意味着應該有幸存者地區更多的空間)

- update--

jheap的完整輸出:

Garbage-First (G1) GC with 2 thread(s) 

Heap Configuration: 
    MinHeapFreeRatio   = 40 
    MaxHeapFreeRatio   = 70 
    MaxHeapSize    = 2306867200 (2200.0MB) 
    NewSize     = 1153433600 (1100.0MB) 
    MaxNewSize    = 1153433600 (1100.0MB) 
    OldSize     = 4194304 (4.0MB) 
    NewRatio     = 2 
    SurvivorRatio   = 8 
    MetaspaceSize   = 16777216 (16.0MB) 
    CompressedClassSpaceSize = 1073741824 (1024.0MB) 
    MaxMetaspaceSize   = 4294963200 (4095.99609375MB) 
    G1HeapRegionSize   = 1048576 (1.0MB) 

Heap Usage: 
G1 Heap: 
    regions = 14488 
    capacity = 15191769088 (14488.0MB) 
    used  = 1083703304 (1033.5000076293945MB) 
    free  = 14108065784 (13454.499992370605MB) 
    7.13348983730946% used 
G1 Young Generation: 
Eden Space: 
    regions = 988 
    capacity = 1163919360 (1110.0MB) 
    used  = 1035993088 (988.0MB) 
    free  = 127926272 (122.0MB) 
    89.009009009009% used 
Survivor Space: 
    regions = 45 
    capacity = 47185920 (45.0MB) 
    used  = 47185920 (45.0MB) 
    free  = 0 (0.0MB) 
    100.0% used 
G1 Old Generation: 
    regions = 2 
    capacity = 1095761920 (1045.0MB) 
    used  = 524296 (0.5000076293945312MB) 
    free  = 1095237624 (1044.4999923706055MB) 
    0.04784762003775419% used 

30424 interned Strings occupying 3027304 bytes. 
+0

Hey Neo,你會介意輸出剩餘的jmap輸出嗎? – entpnerd

+0

@JonathanThoms當然 – Neo

回答

2

我的意見。

  1. 當您停止自定義某些參數時,G1GC會很有效。我建議刪除Xmn(年輕的gen)設置。的-Xms

  2. 設定不同的值-Xmx

  3. 區尺寸應該設置爲最大的堆內存大小/ 2048對於4G堆,2 MB應區域大小& 2 GB堆,1 MB應理想的地區大小。要配置

  4. 關鍵參數:-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, -XX:ConcGCThreads=n除了-Xms and -Xmx

看一看這個SE postinfoQ article的更多細節。

建議從Oracle

當你評估和微調G1 GC,請記住以下建議:

年輕一代尺寸:避免明確設置年輕一代的尺寸與-Xmn選項或任何或其他相關的選項,如-XX:NewRatio。確定年輕一代的規模優先於目標暫停時間目標。

暫停時間目標:當您評估或調整任何垃圾回收時,始終存在延遲與吞吐量的權衡。

0

我最好的猜測會是你的應用程序正在創造大量的對象,而伊甸園空間很快就會填滿(或者你的應用程序正在創造出很多長壽命物體,能夠在Young GC中倖存下來)。

在年輕的GC,活動對象將始終被移動到生存空間之一。只有當物體足夠陳舊時,或者如果不是來自伊甸園空間的所有物體都不能放入選定的倖存空間,物體纔會被移動到老根。

你介意分享什麼是你正在試圖解決真正的問題,或者你只是好奇,想知道爲什麼生存空間已滿。

+0

事實上,我的應用程序沒有問題。我只想弄清楚G1GC是否真的是Web應用的更好選擇 – Neo

+0

您應該啓用GC日誌和配置文件您的應用程序。在GC日誌中使用GC Viewer https://github.com/chewiebug/GCViewer會給你更好的想法。 – Pushkar