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
Это случилось и со мной , Мы уменьшили размер ОЗУ на нашей виртуальной машине и через пару дней начали получать эту ошибку, и сервис не появился навсегда.
решение :: мы уменьшили размер кучи приложения или службы, имеющей эту проблему, и служба снова появилась нормально.