Ben*_*ard 15 java memory-leaks memory-management
我们有一个Java webapp,我们从Java 1.5.0.19升级到Java 1.6.0.21
/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
正如你所看到的那样它应该预先分配2GB的堆并且最大值为3GB(为什么我们预先分配这么多是因为这个应用程序很古老而且设计很差,因此需要加载很多东西).我们在升级到1.6后最近看到的问题是,有时候内存会出现问题.虽然内存使用可能是一个应用程序问题,但JVM超过了堆的3GB最大设置.使用top我看到:
 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中的内容可能会使用额外的内存?试着看看有没有人见过这个.
Ste*_*n C 13
那么具有3GB堆,256MB permgen甚至一些开销的JVM怎么能消耗6.9GB呢?
可能的解释包括:
在责备JVM之前,我倾向于责怪应用程序.
Ben*_*ard 10
长话短说,我最初的反应是正确的,这是JVM中的一个错误.我们使用1.6.0_21,结果发现我们遇到了与https://confluence.atlassian.com/pages/viewpage.action?pageId=219023686中所述完全相同的错误.升级到1.6.0_37修复了问题,我们从每天崩溃到2周而没有崩溃.
因此,虽然不仅仅归咎于JVM的情绪是一个很好的策略,但似乎还应该建议不要总是假设JVM没有bug,就像所有软件偶尔会有bug一样.另外,似乎是保持最新状态的好政策.
感谢您对此的所有帮助!
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html
请注意,JVM 使用的内存不仅仅是堆。例如,Java 方法、线程堆栈和本机句柄是在与堆以及 JVM 内部数据结构分开的内存中分配的。
因此,如果您有很多线程和很多本机句柄,则内存可能会超出堆限制。您确定以前也没有发生过这种情况吗?
另请查看:Java 使用的内存多于分配的内存