Проблема настройки 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? Если да, то как мне собрать старые регионы и освободить достаточно памяти для приложения?
Спасибо за вашу помощь.