Pourquoi toujours "GC (Allocation Failure)"?
Serveur 64 bits Java HotSpot (TM) VM (25.25-b02) pour 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]
"Echec de l'allocation" est une cause du cycle du GC.
"Échec d'allocation" signifie qu'il ne reste plus d'espace dans Eden pour allouer un objet. Donc, c'est la cause normale du jeune GC.
Les machines JVM plus anciennes n'imprimaient pas la cause du CPG pour des cycles GC mineurs.
"L'échec de l'allocation" est presque la seule cause possible d'une GC mineure. La phase de remarque du système de gestion de contenu (si +XX:+ScavengeBeforeRemark
est activé) pourrait être une autre raison de la perte de contrôle du GC.
"Echec de l'allocation" est la cause du coup de pied de GC qui n'est pas correct. C'est le résultat du fonctionnement du GC.
Le GC débute lorsqu'il n'y a plus d'espace à allouer (en fonction de la région, un GC majeur ou mineur est effectué). Une fois que GC est effectué si l'espace est libéré assez bien, mais s'il n'y a pas assez de taille, il échoue. L'échec de l'allocation en est un. Les documents ci-dessous ont une bonne explication https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html