Java GC (Allocation Failure)

129

Warum immer "GC (Allocation Failure)"?

Java HotSpot (TM) 64-Bit-Server-VM (25.25-b02) für 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
quelle

Antworten:

202

"Allocation Failure" ist eine Ursache für den Beginn des GC-Zyklus.

"Zuordnungsfehler" bedeutet, dass in Eden kein Platz mehr zum Zuweisen von Objekten übrig bleibt. Es ist also eine normale Ursache für junge GC.

Ältere JVM druckten keine GC-Ursache für kleinere GC-Zyklen.

"Allocation Failure" ist fast nur eine mögliche Ursache für geringfügige GC. Ein weiterer Grund für den Kick eines kleinen GC könnte die CMS-Bemerkungsphase sein (falls +XX:+ScavengeBeforeRemarkaktiviert).

Alexey Ragozin
quelle
1
Vielen Dank. Stellen Sie nur fest, dass die alte JVM keinen Zuordnungsfehler druckt.
user3644708
2
Ich verstehe diese Antwort nicht vollständig, ist sie also zu vermeiden oder nicht? "Es ist eine normale Ursache für junge GC". Ist der junge GC dann die falsche Wahl?
Thomas
7
Ja, das ist normales Verhalten
Alexey Ragozin
183
GC (Allocation Failure) ist eine schlechte Wortwahl für ein Ereignis, das normalerweise mehrmals am Tag auftritt. Diese JVM-Ingenieure sollten häufiger ausgehen und versuchen, in der realen Welt Kontakte zu knüpfen, damit sie freundlichere Begriffe lernen können, die die Leute verstehen.
Salvador Valencia
78
@SalvadorValencia Es ist in Ordnung, Leute, die regelmäßig GC-Protokolle lesen, sind auch nicht gerade "normal". :)
biziclop
8

"Allocation Failure" ist die Ursache dafür, dass der GC-Kick nicht korrekt ist. Es ist ein Ergebnis der GC-Operation.

Die GC wird aktiviert, wenn kein Platz zum Zuweisen vorhanden ist (je nach Region wird eine kleinere oder größere GC durchgeführt). Sobald die GC durchgeführt wird, wenn der Speicherplatz gut genug freigegeben ist, die Größe jedoch nicht ausreicht, schlägt dies fehl. Ein Zuordnungsfehler ist ein solcher Fehler. Das folgende Dokument enthält eine gute Erklärung: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

Kamal Rathod
quelle
1
"(...) dann tritt ein Zuordnungsfehler auf (weil kein Platz zum Zuweisen der lebenden Objekte aus der zu evakuierenden Region vorhanden ist) und eine vollständige Sammlung von Stop-the-World (STW) wird durchgeführt." - In Java 1.8, Servermodus, habe ich eine kurze Pause reproduziert und beide Spuren werden zusammen gedruckt: [GC (Allocation Failure) 2287742K-> 1148645K (2633216K), 0,4571912 Sek.] [Full GC (Ergonomics) 1148645K-> 1112141K (3184128K), 2,8563984 Sekunden]. Also stimme ich Ihrer Antwort zu ;-)
Jose Manuel Gomez Alvarez
-10

Wenn CMS GC in jdk1.8 diesen Fehler anzeigt, ändere ich den G1 Gc, um dieses Problem zu lösen.

 -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 
Hutmacher Bush
quelle
1
Warum wurde dies so oft abgelehnt? Eine Erklärung wäre nützlich.
Mike Stoddart
2
Weil es so ist, als hätten Sie Ihr Programm in Rust umgeschrieben und jetzt haben Sie keine solchen Nachrichten mehr?
simplylizz