Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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 OutOfMemory异常:加载zip文件时发生mmap错误_Java_Out Of Memory_Java 7_Mmap - Fatal编程技术网

Java OutOfMemory异常:加载zip文件时发生mmap错误

Java OutOfMemory异常:加载zip文件时发生mmap错误,java,out-of-memory,java-7,mmap,Java,Out Of Memory,Java 7,Mmap,我使用JVM参数在生产环境(rhel 5.2 x64、oracle jre 1.7_05、tomcat 7.0.28)上运行我的应用程序: -Xms8192m -Xmx8192m -XX:MaxPermSize=1024m -Doracle.net.tns_admin=/var/ora_net -XX:ReservedCodeCacheSize=512m -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseStringCache -

我使用JVM参数在生产环境(rhel 5.2 x64、oracle jre 1.7_05、tomcat 7.0.28)上运行我的应用程序:

-Xms8192m -Xmx8192m -XX:MaxPermSize=1024m 
-Doracle.net.tns_admin=/var/ora_net -XX:ReservedCodeCacheSize=512m -XX:+AggressiveOpts -XX:+UseFastAccessorMethods 
-XX:+UseStringCache -XX:+OptimizeStringConcat -XX:+UseCompressedOops -XX:+UseG1GC -Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9026 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
几次之后,我得到了这样的堆栈跟踪:

Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to allocate stack guard pages failed.
mmap failed for CEN and END part of zip file
[...]
Caused by: java.lang.OutOfMemoryError: null
    at java.util.zip.ZipFile.$$YJP$$open(Native Method) ~[na:1.7.0_05]
    at java.util.zip.ZipFile.open(Unknown Source) ~[na:1.7.0_05]
    at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05]
    at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05]
    at java.util.jar.JarFile.<init>(Unknown Source) ~[na:1.7.0_05]
    at java.util.jar.JarFile.<init>(Unknown Source) ~[na:1.7.0_05]
    at sun.net.www.protocol.jar.URLJarFile.<init>(Unknown Source) ~[na:1.7.0_05]
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source) ~[na:1.7.0_05]
    at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source) ~[na:1.7.0_05]
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source) ~[na:1.7.0_05]
    at sun.net.www.protocol.jar.JarURLConnection.getInputStream(Unknown Source) ~[na:1.7.0_05]
    at java.net.URL.openStream(Unknown Source) ~[na:1.7.0_05]
    at org.apache.catalina.loader.WebappClassLoader.findLoadedResource(WebappClassLoader.java:3279) ~[na:na]
    at org.apache.catalina.loader.WebappClassLoader.getResourceAsStream(WebappClassLoader.java:1478) ~[na:na]
    at org.apache.http.util.VersionInfo.loadVersionInfo(VersionInfo.java:242) ~[httpcore-4.2.jar:4.2]
    at org.apache.http.impl.client.DefaultHttpClient.setDefaultHttpParams(DefaultHttpClient.java:180) ~[httpclient-4.2.jar:4.2]
    at org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:158) ~[httpclient-4.2.jar:4.2]
    at org.apache.http.impl.client.AbstractHttpClient.getParams(AbstractHttpClient.java:448) ~[httpclient-4.2.jar:4.2]
但我有足够的记忆力:

回答:
java版本中的问题。它在这里描述:

不确定Java 1.7中发生了什么变化,因为我记得在Java 1.6中,我们使用Xms选项,如下所示

  -Xms=512m -Xmx=512m

我以前在资源耗尽时看到过这些错误,例如交换空间耗尽或允许的内存映射不足。查看
sudo cat/proc/$PID/maps | wc-l
cat/proc/sys/vm/max\map\u计数的比较

见下面的评论


我还建议

您的工具包似乎遇到了一个bug。你用的是什么版本

我会减少你的大部分选择,因为它们要么是默认的,什么都不做,要么会使事情复杂化

-mx8g -XX:MaxPermSize=1g -Doracle.net.tns_admin=/var/ora_net 
-XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -Dcom.sun.management.jmxremote.port=9026
我会尝试删除
-XX:+UseG1GC
,因为这是一个相对较新的收集器,不会改变您的结果。

试试这些选项

-Xrunhprof:heap=all,depth=12,cutoff=0
这将在应用程序根目录中生成一个转储文件。以后你可以用它来分析。这将为你的8G内存提供一个快照。您可以查看HP JMeter手册

还明智地选择了Xrunhprof选项。我提到的上述选项将生成一个巨大的转储文件。从手册中,您可以找到合适的选项

的一些段落解释了java jar/zip的工作原理:

OOM错误是在从JavaJDKZipFile进行本机调用(ZipFile.open(native Method))以加载应用程序EAR文件的过程中触发的。此本机JVM操作需要适当的本机内存和可用的虚拟地址空间,以便执行其加载操作。此时的结论是,Java VM 1.5在部署时耗尽了本机内存/虚拟地址空间

Sun Java VM本机内存和MMAP文件

使用JDK1.4/1.5时,JavaVM加载的任何JAR/ZIP文件都会完全映射到地址空间。这意味着加载到单个JVM的EAR/JAR文件越多,Java进程的本机内存占用就越高

这也意味着Java堆和PermGen空间越大;较低的内存用于本机内存空间,如C-Heap和MMAP文件,如果将太多单独的应用程序(EAR文件)部署到单个32位Java进程中,这肯定会成为一个问题

请注意,Sun对JDK1.6(Mustang)进行了改进,并改变了行为,使JAR文件的中心目录仍然被映射,但条目本身是单独读取的;减少本机内存需求

我建议您查看下面的Sun Bug Id链接,以了解有关JDK 1.4/1.5限制的更多详细信息。


出于好奇,您是如何计算Yourkit部件的?是的,我使用的是
yjp-11.0.8
,但问题发生在我安装它之前。我将尝试删除
G1
收集器,但我认为它不能解决我的问题,因为我长期使用
G1
。我现在还有一个问题:。我以前在资源不足时看到过这些错误,例如交换空间不足或允许的内存映射不足。查看一下sudo cat/proc/$PID/maps | wc-l与
cat/proc/sys/vm/max_map_count
的比较是的,我有65538/65536。这是个问题:)。我执行了sysctl-w vm.max\u map\u count=100000,但我仍然需要重新启动应用程序以应用更改?谢谢,您的回答帮助我找出了问题的原因。
-Xrunhprof:heap=all,depth=12,cutoff=0