JVM超过与-Xmx限定的最大存储器(JVM exceeds maximum memory defi

2019-07-31 09:16发布

我们有我们升级从Java 1.5.0.19到Java 1.6.0.21一个Java Web应用程序

/usr/java/jdk1.6.0_21/bin/java -server -Xms2000m -Xmx3000m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dwg.environment=production -Djava.io.tmpdir=/var/cache/jetty -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=31377 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/webapp -Dprogram.name=run.sh -Djava.endorsed.dirs=/opt/3p/jboss/lib/endorsed -classpath /opt/3p/jboss/bin/run.jar:/usr/java/jdk1.6.0_21/lib/tools.jar org.jboss.Main -c default

正如你可以看到它应该3GB预分配堆的2GB和最大程度的发挥(为什么我们预分配这么多是因为这个程序是古老而设计很差,有一吨的东西加载)。 我们已经升级到1.6后,最近看到的问题是,有时记忆穿过屋顶。 虽然内存使用量有可能的应用程序问题的JVM是超过3GB的最大设置为堆。 使用上面我看到:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    
8449 apache    18   0 19.6g 6.9g 5648 S  4.0 84.8  80:42.27 java             

所以怎么可能有3GB堆,256MB PermGen的,甚至还有一些开销JVM消耗6.9GB? 错误在JVM中,将通过升级打造#35是固定的? 若有所失对Java中,这可能是利用额外的内存? 只是想看看是否有人见过这个。

Answer 1:

所以怎么可能有3GB堆,256MB PermGen的,甚至还有一些开销JVM消耗6.9GB?

可能的解释包括:

  • 很多很多的线程堆栈,
  • 内存映射文件,当他们应该是没有被关闭,
  • 使用(可能泄漏)一些本机代码库外的堆内存。

我会倾向于指责JVM之前责怪应用。



Answer 2:

所以长话短说,我最初的反应是正确的它是在JVM中的错误。 我们使用1.6.0_21和原来在概述了我们正在经历完全一样的错误https://confluence.atlassian.com/pages/viewpage.action?pageId=219023686 。 升级到1.6.0_37解决了这一问题,我们从每日的崩溃就2个星期没有崩溃。

因此,尽管人气不只是责怪JVM是一个很好的政策,似乎人们也应尽量不要总是假设JVM是没有缺陷,它像所有的软件都有偶尔的错误。 此外,似乎好政策让事情保持最新状态。

感谢您在这一个所有帮助!



Answer 3:

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

需要注意的是JVM使用更多的内存比刚堆。 例如Java方法,线程堆栈和本机手柄在存储器从堆中,以及JVM内部数据结构独立的分配。

所以,如果你有很多的线程和大量原生手柄,内存可以超过堆限制。 你确定这并没有之前以及发生的呢?

还检查了这一点: Java中使用比分配的内存更多的内存



文章来源: JVM exceeds maximum memory defined with -Xmx