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

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

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