Java GC (échec d'allocation)

129

Pourquoi toujours "GC (Allocation Failure)"?

VM serveur 64 bits Java HotSpot (TM) (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]
user3644708
la source

Réponses:

203

«L'échec d'allocation» est une cause de démarrage du cycle GC.

«Échec d'allocation» signifie qu'il ne reste plus d'espace dans Eden pour allouer l'objet. Donc, c'est une cause normale de jeune GC.

Les JVM plus anciens n'imprimaient pas la cause GC pour les cycles GC mineurs.

«Échec d'allocation» est presque uniquement la cause possible d'un GC mineur. Une autre raison pour laquelle le GC mineur se déclenche pourrait être la phase de remarque du CMS (si elle +XX:+ScavengeBeforeRemarkest activée).

Alexey Ragozin
la source
1
Merci. Constatez simplement que l'ancienne JVM n'imprime pas l'échec d'allocation.
user3644708
2
Je n'obtiens pas complètement cette réponse, est-ce donc à éviter ou non? "c'est la cause normale du jeune GC". Le jeune GC est-il alors le mauvais choix?
Thomas
7
Oui, c'est un comportement normal
Alexey Ragozin
184
GC (Allocation Failure) est un mauvais choix de mots pour un événement qui se produira normalement plusieurs fois par jour. Ces ingénieurs JVM devraient sortir plus souvent et essayer de socialiser dans le monde réel afin d'apprendre des termes plus conviviaux que les gens comprennent.
Salvador Valencia
81
@SalvadorValencia C'est bon, les gens qui lisent régulièrement les journaux GC ne sont pas non plus tout à fait «normaux». :)
biziclop
8

«Échec d'allocation» est la cause du coup de pied du GC n'est pas correct. C'est le résultat du fonctionnement du GC.

Le GC entre en jeu lorsqu'il n'y a pas d'espace à allouer (selon la région, le GC mineur ou majeur est effectué). Une fois que GC est effectué si l'espace est suffisamment libéré, mais s'il n'y a pas assez de taille, il échoue. L'échec d'allocation est l'un de ces échecs. Le document ci-dessous a une bonne explication https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

Kamal Rathod
la source
1
"(...) puis un échec d'allocation se produit (car il n'y a pas d'espace pour allouer les objets vivants de la région en cours d'évacuation) et une collecte complète d'arrêt du monde (STW) est effectuée." - En java 1.8, mode serveur, j'ai reproduit une brève pause et ces deux tracés sont imprimés ensemble: [GC (Allocation Failure) 2287742K-> 1148645K (2633216K), 0.4571912 sec] [Full GC (Ergonomics) 1148645K-> 1112141K (3184128K), 2,8563984 secondes]. Donc, je vote pour votre réponse ;-)
Jose Manuel Gomez Alvarez
-10

Lorsque l'utilisation de CMS GC dans jdk1.8 apparaîtra cette erreur, je change le G1 Gc pour résoudre ce problème.

 -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 
Chapelier Bush
la source
1
Pourquoi cela a-t-il été rejeté tant de fois? Une explication serait utile.
Mike Stoddart
2
Parce que c'est comme dire que vous avez réécrit votre programme dans Rust et que maintenant vous n'avez pas de tels messages?
simplylizz le