Java G1 занимает больше памяти?

Есть ли ограничение для G1, в какой-то статье упоминается, что максимальный размер области составляет 32 МБ, а максимальное количество регионов - 2 КБ, поэтому кажется, что максимальный размер кучи составляет 64 ГБ. Но в нашем кластере это хорошо работает, когда куча составляет 106 ГБ:

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

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 113816633344 (108544.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 68283269120 (65120.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 134217728 (128.0MB)
   G1HeapRegionSize         = 33554432 (32.0MB)

Heap Usage:
G1 Heap:
   regions  = 3392
   capacity = 113816633344 (108544.0MB)
   used     = 72851759528 (69476.85196685791MB)
   free     = 40964873816 (39067.14803314209MB)
   64.00800778196668% used
G1 Young Generation:
Eden Space:
   regions  = 535
   capacity = 39426457600 (37600.0MB)
   used     = 17951621120 (17120.0MB)
   free     = 21474836480 (20480.0MB)
   45.53191489361702% used
Survivor Space:
   regions  = 13
   capacity = 436207616 (416.0MB)
   used     = 436207616 (416.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 1629
   capacity = 73953968128 (70528.0MB)
   used     = 54463930792 (51940.85196685791MB)
   free     = 19490037336 (18587.14803314209MB)
   73.64571796571278% used

18984 interned Strings occupying 2233784 bytes.

По сравнению с CMS, используемый процесс G1 использует больше VSZ (более почти 8 ГБ) и использует отслеживание собственной памяти, разница:

JDK8 + G1 :               
 GC (reserved=4599924KB, committed=4599924KB) 
 Internal (reserved=3611979KB, committed=3611979KB)

JDK8 + CMS :              
GC (reserved=737869KB, committed=737869KB)
Internal (reserved=5451KB, committed=5451KB) 

в деталях G1 инициализирует две кучи:

[0x00007fca198d2386] ReservedSpace::initialize(unsigned long, unsigned long, bool, char*, unsigned long, bool)+0x256
[0x00007fca198d24ba] ReservedSpace::ReservedSpace(unsigned long, unsigned long)+0x6a
[0x00007fca193b1ef5] G1CollectedHeap::initialize()+0x475
[0x00007fca1989e753] Universe::initialize_heap()+0xf3
                             (reserved=1736704KB, committed=1736704KB)

[0x00007fca198d2386] ReservedSpace::initialize(unsigned long, unsigned long, bool, char*, unsigned long, bool)+0x256
[0x00007fca198d24ba] ReservedSpace::ReservedSpace(unsigned long, unsigned long)+0x6a
[0x00007fca193b1f75] G1CollectedHeap::initialize()+0x4f5
[0x00007fca1989e753] Universe::initialize_heap()+0xf3
                             (reserved=1736704KB, committed=1736704KB)

Кажется, инициализация двух кучей G1 удовлетворяет кучке 106G?


person hellodengfei    schedule 06.03.2017    source источник
comment
Да, он может обрабатывать гораздо большие кучи. Скорее всего, люди думали о значениях по умолчанию, потому что эти значения можно изменить.   -  person Peter Lawrey    schedule 06.03.2017
comment
Вы должны предоставить ссылки на «какую-то статью», в которой содержатся такие фундаментальные заявления, например, «максимальное количество регионов равно 2 КБ». Сначала была попытка создать регионы размером 2k, но, как вы можете видеть из собственного дампа кучи, у JVM нет проблем с большим количеством регионов, например, 3392  -  person Holger    schedule 06.03.2017
comment
По сравнению с CMS, используемый процесс G1 использует больше VSZ (более почти 8 ГБ), на самом деле это вызывает oom-killer в производстве.   -  person hellodengfei    schedule 10.03.2017