JVM cant map зарезервированная память при работе в контейнере Docker

Я не могу запустить java вообще в контейнере Docker на моем сервере. Даже при выдаче java -version, Я получаю следующую ошибку.

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

согласно этому, java не может сопоставить 2,5 МБ пространства для зарезервированной памяти? Это кажется неправильным...

у меня есть полный журнал, включенный в конце, но ради некоторой дополнительной информации моя система сообщает следующее:

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

может ли кто-нибудь указать мне в правильном направлении?

Полный Лог: https://gist.github.com/KayoticSully/e206c44681ce261674ba

обновление

@Yobert прибил проблему, и я настоятельно рекомендую вам прочитать комментарии и журнал чата. Хорошая информация.

для тех, кто хочет окончательную команду, которая заставила Java работать:setfattr -n user.pax.flags -v "mr" /usr/bin/java

если ваш дистрибутив не имеет setfattr установленный по умолчанию он должен быть включен в устанавливаемый пакет attr через paceman, apt-get и т. д.

3 ответов


у меня была такая же проблема при использовании ядра с поддержкой Grsec. Чтобы java играла хорошо, мне пришлось отключить MPROTECT на двоичном файле java. Вы можете использовать paxctl утилита для этого:

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

вам понадобится paxctl -c на двоичном сначала, если вы никогда не использовали его на этом двоичном раньше:

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

более подробную информацию о paxctl можно найти по адресу:http://en.wikibooks.org/wiki/Grsecurity/Additional_Utilities


У меня была такая же проблема при запуске Docker на Alpine Linux, после включения мягкого режима PaX он работал:

sysctl -w kernel.pax.softmode=1

мягкий режим отключит большинство функций PaX по умолчанию, поэтому его не рекомендуется включать. Правильный способ-использовать paxctl, как уже упоминалось выше.

посмотреть здесь: https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Support_soft_mode


Это случилось и со мной , Мы уменьшили размер ОЗУ на нашей виртуальной машине и через пару дней начали получать эту ошибку, и сервис не появился навсегда.

решение :: мы уменьшили размер кучи приложения или службы, имеющей эту проблему, и служба снова появилась нормально.