Проблема настройки Java G1 GC: старые регионы не собраны

В настоящее время я пытаюсь настроить Apache NiFi, чтобы он работал с высокой пропускной способностью, но я не могу избежать Full GC.

Когда поток запускается, возникают очень быстрые молодые GC, но они не могут справиться с потребностью в распределении, пока в конечном итоге не будет запущен полный GC. Эта ситуация происходит с различными размерами кучи (от 8 до 50 ГБ) и базовой конфигурацией (только размер области и назначенные потоки были настроены в соответствии с документацией оракула):

-XX:ConcGCThreads=3
-XX:G1HeapRegionSize=16
-XX:InitialHeapSize=34359738368
-XX:MaxHeapSize=34359738368
-XX:ParallelGCThreads=10
-XX:+ParallelRefProcEnabled
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGC
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC

Ниже приведен анализ дампа GC, выполненный с использованием GCViewer:

Просматривая журналы, я заметил, что количество старых регионов, выбранных для смешанных ГХ, всегда равно нулю. Согласно этой действительно полезной статье, вы можете увеличить это, удалив InitiatingHeapOccupancyPercent и разрешив начальную фазу маркировки начинаться раньше. Это, кажется, не имеет никакого эффекта, учитывая, что количество выбранных старых регионов остается нулевым:

[G1Ergonomics (CSet Construction) finish choosing CSet, eden: 1777 regions, survivors: 251 regions, old: 0 regions, predicted pause time: 216.28 ms, target pause time: 200.00 ms]

Согласно документации оракула, есть экспериментальные флаги, которые я мог бы использовать, например, G1MixedGCLiveThresholdPercent = 65, но даже если я добавлю флаг UnlockExperimentalVMOptions перед всем остальным, я получу следующую ошибку:

2016-10-10 14:48:14,285 ERROR [NiFi logging handler] org.apache.nifi.StdErr Error: VM option 'G1MixedGCLiveThresholdPercent' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions

В основном, флаг игнорируется.

Во-первых, может ли это быть не собрание старых регионов, чтобы вызвать полные GC? Если да, то как мне собрать старые регионы и освободить достаточно памяти для приложения?

Спасибо за вашу помощь.

0 ответов

Другие вопросы по тегам