web-dev-qa-db-fra.com

JVM se bloque avec error = 'Impossible d'allouer de la mémoire' (errno = 12)

Mon code se bloque avec ce message d'erreur

Executing "/usr/bin/Java  com.utils.BotFilter"
OpenJDK 64-Bit Server VM warning: INFO: 
os::commit_memory(0x0000000357c80000, 2712666112, 0) failed; 
error='Cannot allocate memory' (errno=12)

La mémoire est insuffisante pour que Java Runtime Environment puisse continuer . L'allocation de mémoire native (malloc) n'a pas pu attribuer 2712666112 octets pour la validation de la mémoire réservée . Un fichier de rapport d'erreur contenant plus d'informations est enregistré en tant que: /tmp/jvm-29955/hs_error.log`

Voici le contenu du hs_error.log file généré:

https://Pastebin.com/yqF2Yy4P

Cette ligne du journal des collisions me semble intéressante:

Memory: 4k page, physical 98823196k(691424k free), swap 1048572k(0k free)

Cela signifie-t-il que la machine a de la mémoire mais manque d'espace d'échange?

Voici meminfo dans le journal des collisions, mais je ne sais pas vraiment comment l’interpréter. Par exemple, quelle est la différence entre MemFree et MemAvailable? Combien de mémoire prend ce processus?

/proc/meminfo:

MemTotal:       98823196 kB
MemFree:          691424 kB
MemAvailable:    2204348 kB
Buffers:          145568 kB
Cached:          2799624 kB
SwapCached:       304368 kB
Active:         81524540 kB
Inactive:       14120408 kB
Active(anon):   80936988 kB
Inactive(anon): 13139448 kB
Active(file):     587552 kB
Inactive(file):   980960 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       1048572 kB
SwapFree:              0 kB
Dirty:              1332 kB
Writeback:             0 kB
AnonPages:      92395828 kB
Mapped:           120980 kB
Shmem:           1376052 kB
Slab:             594476 kB
SReclaimable:     282296 kB
SUnreclaim:       312180 kB
KernelStack:      317648 kB
PageTables:       238412 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    50460168 kB
Committed_AS:   114163748 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      314408 kB
VmallocChunk:   34308158464 kB
HardwareCorrupted:     0 kB
AnonHugePages:  50071552 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      116924 kB
DirectMap2M:     5115904 kB
DirectMap1G:    95420416 kB
7
Generic Person

Solutions possibles:

  • Réduire la charge de mémoire sur le système
  • Augmenter la mémoire physique ou échanger de l'espace
  • Vérifiez si le magasin de support d'échange est plein
  • Utiliser Java 64 bits sur un système d'exploitation 64 bits
  • Réduire la taille du segment de mémoire Java (-Xmx/-Xms)
  • Diminuer le nombre de threads Java
  • Diminuer la taille des piles de threads Java (-Xss)
  • Définissez un cache de code plus grand avec -XX: ReservedCodeCacheSize =
  • Si vous avez plusieurs contextes guerres déployés sur votre Tomcat, essayez de les réduire.
4
Scary Wombat

Comme Scary Wombat mentionne, la JVM tente d’allouer 2712666112 octets (2,7 Go) de mémoire et vous ne disposez que de 691424000 octets (0,69 Go) de mémoire physique libre et que rien n’est disponible sur l’échange. 

0
Patricio Carranza