Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM在Docker容器中运行时无法映射保留内存_Java_Jvm_Docker_Mmap - Fatal编程技术网

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

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

我似乎根本无法在服务器上的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
谁能给我指出正确的方向吗

完整日志:

更新

@尤伯特解决了这个问题,我强烈建议你仔细阅读评论和聊天日志。好消息

对于那些想要让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标准版和虚拟版上对我确实有效。