JVM не может отобразить зарезервированную память при работе в контейнере Docker
Я не могу запустить Java в контейнере Docker на моем сервере. Даже при выдаче java -version
я получаю следующую ошибку.
[email protected]:/# 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 МБ пространства для зарезервированной памяти? Это не кажется правильным...
В конце я включил полный журнал, но ради какой-то дополнительной информации моя система сообщает следующее:
[email protected]:/# uname -m
x86_64
[email protected]:/# 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
Обновление
@Йоберт прибил проблему, и я настоятельно рекомендую вам прочитать комментарии и журнал чата. Хорошая информация там.
Для тех, кому нужна последняя команда, которая сделала Java работающим: setfattr -n user.pax.flags -v "mr" /usr/bin/java
Если в вашем дистрибутиве по умолчанию не установлен setfattr
, его следует включить в установочный пакет attr через paceman, apt-get и т.д.
Ответы
Ответ 1
У меня была такая же проблема при использовании ядра с поддержкой 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
Ответ 2
У меня была такая же проблема при запуске 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
Ответ 3
Это случилось и со мной,
Мы уменьшили объем оперативной памяти на нашей виртуальной машине и через пару дней начали получать эту ошибку, и служба не работала вечно.
Решение :: Мы уменьшили размер кучи приложения или службы, имеющей эту проблему, и служба снова заработала нормально.