Java GC (сбой выделения)

130

Почему всегда "GC (Ошибка распределения)"?

64-разрядная серверная виртуальная машина Java HotSpot (TM) (25.25-b02) для linux-amd64 JRE ( 1.8.0_25 -b17),

CommandLine flags: 
-XX:CMSInitiatingOccupancyFraction=60 
-XX:GCLogFileSize=10485760 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:InitialHeapSize=32212254720 
-XX:MaxHeapSize=32212254720 
-XX:NewRatio=10 
-XX:OldPLABSize=16 
-XX:ParallelGCThreads=4 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintStringTableStatistics 
-XX:+PrintTenuringDistribution 
-XX:StringTableSize=1000003 
-XX:SurvivorRatio=4 
-XX:TargetSurvivorRatio=50 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC
27.329: [GC (Allocation Failure) 27.329: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age   1:   16885304 bytes,   16885304 total
: 349568K->16618K(436928K), 0.2069129 secs] 349568K->16618K(31369920K), 0.2070712 secs] [Times: user=0.78 sys=0.04, real=0.21 secs]


28.210: [GC (Allocation Failure) 28.210: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age   1:   28866504 bytes,   28866504 total
- age   2:   12582536 bytes,   41449040 total
: 366186K->47987K(436928K), 0.2144807 secs] 366186K->47987K(31369920K), 0.2146024 secs] [Times: user=0.84 sys=0.01, real=0.22 secs]


29.037: [GC (Allocation Failure) 29.038: [ParNew
Desired survivor size 44728320 bytes, new threshold 2 (max 15)
- age   1:   28443488 bytes,   28443488 total
- age   2:   28386624 bytes,   56830112 total
- age   3:   12579928 bytes,   69410040 total
: 397555K->76018K(436928K), 0.2357352 secs] 397555K->76018K(31369920K), 0.2358535 secs] [Times: user=0.93 sys=0.01, real=0.23 secs]
user3644708
источник

Ответы:

203

«Ошибка распределения» - причина срабатывания цикла сборки мусора.

«Ошибка выделения» означает, что в Eden больше не осталось места для размещения объекта. Итак, это нормальная причина молодых GC.

Более старая JVM не печатала причины сборки мусора для незначительных циклов сборки мусора.

«Ошибка распределения» - почти единственная возможная причина незначительного GC. Другой причиной для запуска второстепенного сборщика мусора может быть фаза замечаний CMS (если +XX:+ScavengeBeforeRemarkона включена).

Алексей Рагозин
источник
1
Спасибо. Просто обнаружите, что старая JVM не выводит ошибку распределения.
user3644708 06
2
Я не получил этого ответа полностью, так что следует избегать или нет? «Это нормальная причина молодых GC». Значит, молодой GC - неправильный выбор?
Thomas
7
Да, это нормальное поведение
Алексей Рагозин
185
GC (Allocation Failure) - плохой выбор слов для события, которое обычно происходит много раз в день. Эти инженеры JVM должны чаще выходить на улицу и пытаться общаться в реальном мире, чтобы они могли выучить более дружественные термины, понятные людям.
Сальвадор Валенсия
81
@SalvadorValencia Ничего страшного, люди, которые читают логи GC на регулярной основе, тоже не совсем «нормальные». :)
biziclop
8

«Ошибка распределения» является причиной неправильного запуска GC. Это результат работы сборщика мусора.

Сборка мусора срабатывает, когда нет места для выделения (в зависимости от региона, выполняется второстепенная или основная сборка мусора). Как только сборка мусора выполняется, если пространство освобождено достаточно хорошо, но если его недостаточно, происходит сбой. Ошибка распределения - одна из таких неудач. Ниже в документе есть хорошее объяснение https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

Камаль Ратод
источник
1
«(...) тогда происходит сбой выделения (потому что нет места для выделения живых объектов из эвакуируемого региона), и выполняется полный сбор данных Stop-the-world (STW)». - В java 1.8 в режиме сервера я воспроизвел короткую паузу, и обе эти трассировки печатаются вместе: [GC (Ошибка распределения) 2287742K-> 1148645K (2633216K), 0,4571912 секунд] [Full GC (Ergonomics) 1148645K-> 1112141K (3184128K), 2,8563984 сек]. Так что я поддерживаю ваш ответ ;-)
Хосе Мануэль Гомес Альварес
-10

При использовании CMS GC в jdk1.8 появится эта ошибка, я меняю G1 Gc, чтобы решить эту проблему.

 -Xss512k -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=6 -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
Шляпник Буш
источник
1
Почему это было отклонено так много раз? Объяснение было бы полезно.
Майк Стоддарт
2
Потому что это все равно что сказать, что вы переписали свою программу на Rust и теперь у вас нет таких сообщений?
simplelizz