Java GC (помилка розподілу)


129

Чому завжди "GC (відмова розподілу)"?

64-бітний сервер VM сервера Java HotSpot (TM) (25.25-b02) для JRE Linux-amd64 ( 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]

Відповіді:


203

"Невдача виділення" є причиною початку циклу GC.

"Невдача розподілу" означає, що в Едені більше не залишається місця для виділення об'єкта. Отже, це нормальна причина молодих ГК.

Старіші JVM не друкували причину GC для незначних циклів GC.

"Невдача розподілу" є майже єдиною можливою причиною незначного ГК. Ще однією причиною, коли незначний GC може почати, може бути фаза зауваження CMS (якщо +XX:+ScavengeBeforeRemarkвона включена)


1
Дякую. Просто встановіть, що старий JVM не друкує помилку розподілу.
user3644708

2
Я не отримую цієї відповіді повною мірою, тому її слід уникати чи ні? "це нормальна причина молодих ГК". Тоді молодий GC - неправильний вибір?
Томас

7
Так, це нормальна поведінка
Олексій Рагозін

183
GC (відмова розподілу) - це поганий вибір слів для події, яка зазвичай відбуватиметься багато разів на день. Ці інженери JVM повинні виходити частіше і намагатися спілкуватися в реальному світі, щоб вони могли навчитися більш дружнім термінам, які люди розуміють.
Сальвадор Валенсія

80
@SalvadorValencia Це нормально, що люди, які читають журнали GC регулярно, теж не зовсім "нормальні". :)
biziclop

8

"Невдача виділення" є причиною, коли GC б'є невірно. Це результат роботи GC.

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


1
"(...) тоді відбувається помилка розподілу (оскільки немає місця для виділення живих об'єктів з регіону, який евакуюється), і виконується повна колекція" зупинки світу "." - У 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.