GC GC (errore allocazione)


129

Perché sempre "GC (Allocation Failure)"?

Java VM Server HotSpot (TM) a 64 bit (25.25-b02) per 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]

Risposte:


203

"Allocation Failure" è una causa del ciclo GC da dare il via.

"Errore di allocazione" significa che non c'è più spazio rimasto nell'Eden per allocare l'oggetto. Quindi, è la causa normale del giovane GC.

Le versioni precedenti di JVM non stampavano la causa GC per cicli GC minori.

"Allocation Failure" è quasi possibile solo causa per GC minore. Un altro motivo per cui il GC minore deve essere espulso potrebbe essere la fase di osservazione del CMS (se +XX:+ScavengeBeforeRemarkabilitata).


1
Grazie. Scopri solo che la vecchia JVM non stampa Errore allocazione.
user3644708

2
Non ricevo completamente questa risposta, quindi è da evitare o no? "è la causa normale del giovane GC". Allora il giovane GC è la scelta sbagliata?
Thomas,

7
Sì, questo è un comportamento normale
Alexey Ragozin,

183
GC (Allocation Failure) è una cattiva scelta di parole per un evento che si verificherà normalmente più volte al giorno. Quegli ingegneri JVM dovrebbero uscire più spesso e cercare di socializzare nel mondo reale in modo che possano imparare termini più amichevoli che le persone capiscono.
Salvador Valencia,

80
@SalvadorValencia Va bene, le persone che leggono regolarmente i registri GC non sono esattamente "normali". :)
biziclop,

8

"Allocation Failure" è la causa per cui il calcio del GC non è corretto. È il risultato dell'operazione GC.

Il GC interviene quando non c'è spazio da allocare (a seconda del GC minore o maggiore della regione). Una volta eseguito il GC se lo spazio viene liberato abbastanza bene, ma se non c'è abbastanza dimensione, fallisce. Un errore di allocazione è uno di questi errori. Di seguito il documento ha una buona spiegazione https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html


1
"(...) quindi si verifica un errore di allocazione (perché non c'è spazio per allocare gli oggetti live dalla regione che viene evacuata) e viene eseguita una raccolta completa stop-the-world (STW)." - In java 1.8, modalità server, ho riprodotto una breve pausa ed entrambe queste tracce sono stampate insieme: [GC (Allocation Failure) 2287742K-> 1148645K (2633216K), 0.4571912 sec] [GC completo (ergonomia) 1148645K-> 1112141K (3184128K), 2.8563984 secondi]. Quindi ho votato a favore della tua risposta ;-)
Jose Manuel Gomez Alvarez,

-10

Quando uso GC CMS in jdk1.8 verrà visualizzato questo errore, cambio G1 Gc risolve questo problema.

 -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
Perché è stato votato così tante volte? Una spiegazione sarebbe utile.
Mike Stoddart,

2
Perché è come dire che hai riscritto il tuo programma in Rust e ora non hai questi messaggi?
Simplylizz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.