JVM cant map mémoire réservée lors de l'exécution dans un conteneur Docker

Je n'arrive pas à exécuter java du tout dans un conteneur Docker sur mon serveur. Même lors de l'émission java -version, j'obtiens l'erreur suivante.

root@86088d679103:/# java -version
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000035ce1000000, 2555904, 1) failed; error='Operation not permitted' (errno=1)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2555904 bytes for committing reserved memory.
# An error report file with more information is saved as:
# //hs_err_pid17.log

selon ceci, java ne peut pas cartographier 2.5 Mb d'espace réservé à la mémoire? Cela ne semble pas juste...

j'ai le log complet inclus à la fin, mais pour le bien de quelques informations supplémentaires, mon système de reporting suivantes:

root@86088d679103:/# uname -m
x86_64
root@86088d679103:/# free -mh
             total       used       free     shared    buffers     cached
Mem:           15G       9.7G       5.8G       912K       148M       8.9G
-/+ buffers/cache:       639M        14G
Swap:          15G         0B        15G

quelqu'un peut-il m'indiquer la bonne direction?

Log Complet: https://gist.github.com/KayoticSully/e206c44681ce261674ba

mise à Jour

@Yobert a résolu le problème et je vous suggère fortement de lire les commentaires et le journal de chat. Bonne info.

Pour ceux qui veulent la dernière commande que fait Java: setfattr -n user.pax.flags -v "mr" /usr/bin/java

Si votre distribution n'a pas setfattr installé par défaut, il doit être inclus dans le paquet installable attr via paceman, apt-get, etc.

11
demandé sur venergiac 2014-12-03 05:25:53

3 réponses

j'ai eu ce même problème en utilisant un noyau grsec. Pour que java joue bien, j'ai dû désactiver MPROTECT sur le binaire java. Vous pouvez utiliser le paxctl utilitaire pour ceci:

paxctl -m /usr/lib/jvm/java-7-openjdk/jre/bin/java

Vous aurez besoin de faire paxctl -c sur le binaire d'abord si vous n'avez jamais utilisé sur que le binaire avant:

paxctl -c /usr/lib/jvm/java-7-openjdk/jre/bin/java

plus d'informations sur paxctl peuvent être trouvées à: http://en.wikibooks.org/wiki/Grsecurity/Additional_Utilities

12
répondu Yobert 2017-04-05 21:02:38

j'ai eu le même problème quand J'ai lancé Docker sur Linux Alpine, après avoir activé le mode pax soft cela a fonctionné:

sysctl -w kernel.pax.softmode=1

Le mode Soft désactivera la plupart des fonctionnalités PaX par défaut, il n'est donc pas recommandé de l'activer. La bonne façon est d'utiliser paxctl, comme déjà mentionné ci-dessus.

Aussi, jetez un oeil ici: https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Support_soft_mode

11
répondu Sven Mohr 2016-04-08 19:27:46

Cela m'est arrivé aussi , Nous avons réduit la taille de la mémoire vive sur notre VM et après quelques jours a commencé à obtenir cette erreur et le service n'est pas venu pour toujours.

Solution:: nous avons réduit la taille du tas de l'application ou du service ayant ce problème et le service est revenu très bien.

1
répondu Ankit 2016-07-28 16:51:45