我们有一个Java网络应用程序,我们将其从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中缺少了使用额外内存的某些内容?只是想看看是否有人之前遇到过这个问题。