2016-08-07 6 views
-1

Я столкнулся с этим странным поведением в java GC.Java Garbage Collector нечетное поведение

У нас есть приложение с максимальной кучей 1 ГБ, и это привело к превышению предельных значений предельных значений на GC.

Здесь следует выход jmap -heap;

Heap Configuration: 
    MinHeapFreeRatio   = 40 
    MaxHeapFreeRatio   = 70 
    MaxHeapSize    = 1610612736 (1536.0MB) 
    NewSize     = 1572864 (1.5MB) 
    MaxNewSize    = 536870912 (512.0MB) 
    OldSize     = 1072168960 (1022.5MB) 
    NewRatio     = 2 
    SurvivorRatio   = 8 
    MetaspaceSize   = 21807104 (20.796875MB) 
    CompressedClassSpaceSize = 1073741824 (1024.0MB) 
    MaxMetaspaceSize   = 17592186044415 MB 
    G1HeapRegionSize   = 0 (0.0MB) 
Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 37224448 (35.5MB) 
    used  = 34328776 (32.73847198486328MB) 
    free  = 2895672 (2.7615280151367188MB) 
    92.2210478446853% used 
From Space: 
    capacity = 1572864 (1.5MB) 
    used  = 786432 (0.75MB) 
    free  = 786432 (0.75MB) 
    50.0% used 
To Space: 
    capacity = 1572864 (1.5MB) 
    used  = 0 (0.0MB) 
    free  = 1572864 (1.5MB) 
    0.0% used 
PS Old Generation 
    capacity = 1072168960 (1022.5MB) 
    used  = 13918336 (13.2735595703125MB) 
    free  = 1058250624 (1009.2264404296875MB) 
    1.2981476352383863% used 

Итак, мы настроили GC со следующими параметрами;

-XX:NewSize=512 
-XX:MaxNewSize=512 
-XX:SurvivorRatio=16 
-XX:NewRatio=1 

NewSize и MaxNewSize должны были быть установлены в мегабайтах.

Но с этой конфигурацией мы получаем следующую карту кучи.

Heap Configuration: 
    MinHeapFreeRatio   = 40 
    MaxHeapFreeRatio   = 70 
    MaxHeapSize    = 2147483648 (2048.0MB) 
    NewSize     = 1572864 (1.5MB) 
    MaxNewSize    = 1572864 (1.5MB) 
    OldSize     = 1072168960 (1022.5MB) 
    NewRatio     = 1 
    SurvivorRatio   = 16 
    MetaspaceSize   = 21807104 (20.796875MB) 
    CompressedClassSpaceSize = 1073741824 (1024.0MB) 
    MaxMetaspaceSize   = 17592186044415 MB 
    G1HeapRegionSize   = 0 (0.0MB) 
Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 524288 (0.5MB) 
    used  = 200200 (0.19092559814453125MB) 
    free  = 324088 (0.30907440185546875MB) 
    38.18511962890625% used 
From Space: 
    capacity = 524288 (0.5MB) 
    used  = 98304 (0.09375MB) 
    free  = 425984 (0.40625MB) 
    18.75% used 
To Space: 
    capacity = 524288 (0.5MB) 
    used  = 0 (0.0MB) 
    free  = 524288 (0.5MB) 
    0.0% used 
PS Old Generation 
    capacity = 1072168960 (1022.5MB) 
    used  = 522704656 (498.49000549316406MB) 
    free  = 549464304 (524.0099945068359MB) 
    48.752078776837564% used 

Теперь пространство емкости Eden только 0.5Мб, но он использует только 38% из которых ранее было 92%, а мощность составляла 35MB. И использование старого поколения увеличилось до 50%, что было ранее около 2%.

Может кто-нибудь объяснить, почему GC ведет себя так?

+0

* «NewSize и MaxNewSize должны были быть установлены в МБ». * - Тогда почему вы не устанавливаете их в МБ? – the8472

+0

Мы уже установили их. Но хочу знать причину этого вышеупомянутого поведения. –

+0

Какова общая доступная системная память и какие значения вы задали для -Xms и -Xmx – ravthiru

ответ

0

Мне, наконец, удалось найти причину.

Когда JVM пытается выделить кучу для объекта, он сначала проверяет доступный размер соответствующего TLAB (Thread Local Allocation Buffer), а если он недостаточно, он пытается его вырастить. Если оставшегося размера пространства Эдена недостаточно для расширения TLAB, JVM ищет пространство Идена. Остального размера пространства Эдена тоже недостаточно, тогда JVM выделяет объект непосредственно в пространстве старого поколения.

Кроме того, если размер NewGen меньше, то не только пространство Идена, но и обе оставшиеся в живых места меньше (обычно 8 или 16 раз). Поэтому, даже если JVM сумеет выделить пространство в пространстве Eden, если этим объектам удастся выжить для нескольких небольших коллекций. Оставшееся в живых пространство переполнилось бы, и его переместили в пространство OldGen.

Смежные вопросы