Java JVM在Docker容器中运行时无法映射保留内存
我似乎根本无法在服务器上的Docker容器中运行java。即使在发布Java JVM在Docker容器中运行时无法映射保留内存,java,jvm,docker,mmap,Java,Jvm,Docker,Mmap,我似乎根本无法在服务器上的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 insuf
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
谁能给我指出正确的方向吗
完整日志:
更新
@尤伯特解决了这个问题,我强烈建议你仔细阅读评论和聊天日志。好消息
对于那些想要让Java工作的最后一个命令的人:setfattr-nuser.pax.flags-v“mr”/usr/bin/Java
如果您的发行版在默认情况下未安装
setfattr
,则应通过paceman、apt get等将其包含在可安装的软件包attr中。在使用启用Grsec的内核时,我遇到了同样的问题。为了让java玩得更好,我必须禁用java二进制文件上的MPROTECT。您可以使用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的更多信息,请访问:在启用PaX软模式后,我在Alpine Linux上运行Docker时遇到了相同的问题:
sysctl -w kernel.pax.softmode=1
默认情况下,软模式将禁用大多数PaX功能,因此不建议启用它。正确的方法是使用paxctl,如上所述
请看这里:
这件事也发生在我身上, 我们减少了虚拟机上的RAM大小,几天后就开始出现这个错误,服务永远无法提供
解决方案::我们减少了出现此问题的应用程序或服务的堆大小,服务恢复正常。了解这一点非常棒,但它对我不起作用。。。我确保在实际执行的java二进制文件上禁用了该标志,但同样的问题仍在发生。如果内核支持的话,还有一种更新的方法可以通过xattrs而不是二进制头来设置安全属性。也许你禁用了传统模式?嗯,我会尝试删除更多的标志,而不仅仅是m。我们删除了java的pemrs(尽管我不认为这是惯用的)好吧,所以。。。我在dmesg中得到这个,看起来像<代码>[24753.007799]grsec:From 10.0.0.106:by/usr/lib/jvm/java-8-jre/jre/bin/java[java:19815]uid/euid:1000/1000 gid/egid:1000/1000,parent/usr/bin/bash[bash:14286]uid/euid:1000/1000 gid/egid:1000/1000我也需要在bash上这样做吗?这是在我禁用了JavaBin上的所有标志之后,Java bin应该就是您所需要的了。也许它正在使用的docker容器中有一个不同的二进制文件?这对我不起作用。我得到:[91msysctl:error:'kernel.pax.softmode'是一个未知密钥,这是否意味着我的系统没有使用pax?谢谢。这在3.7.0标准版和虚拟版上对我确实有效。