一尘不染

在Docker容器中运行时JVM无法映射保留的内存

docker

我似乎根本无法在服务器上的Docker容器中运行Java。即使在发出时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默认未安装,则应通过心率调节器,apt-get等将其包含在可安装软件包attr中。


阅读 332

收藏
2020-06-17

共1个答案

一尘不染

使用启用了Grsec的内核时,我遇到了同样的问题。为了使Java发挥出色,我不得不在Java二进制文件上禁用MPROTECT。您可以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

2020-06-17