我似乎根本无法在服务器上的Docker容器中运行Java。即使在发出时java -version,我也会收到以下错误。
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.5Mb的空间吗?这似乎不正确…
我在末尾包含了完整的日志,但是为了提供一些额外的信息,我的系统报告了以下内容:
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 -n user.pax.flags -v "mr" /usr/bin/java
如果您的发行版setfattr默认未安装,则应通过心率调节器,apt-get等将其包含在可安装软件包attr中。
setfattr
使用启用了Grsec的内核时,我遇到了同样的问题。为了使Java发挥出色,我不得不在Java二进制文件上禁用MPROTECT。您可以paxctl为此使用该实用程序:
paxctl
paxctl -m /usr/lib/jvm/java-7-openjdk/jre/bin/java
你需要做paxctl -c的第一,如果你从来没有使用过的二进制前的二进制文件:
paxctl -c
paxctl -c /usr/lib/jvm/java-7-openjdk/jre/bin/java
有关paxctl的更多信息,请参见:http : //en.wikibooks.org/wiki/Grsecurity/Additional_Utilities