JVM превышает максимальный объем памяти, определенный с помощью -Xmx

У нас есть веб-приложение на 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

Как вы можете видеть, оно должно предварительно выделить 2 ГБ кучи и максимально до 3 ГБ (поэтому мы заранее выделяем столько, потому что это приложение старое и плохо спроектированное, поэтому у него есть куча вещей для загрузки). Проблема, с которой мы столкнулись после обновления до 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             

Так как же JVM с кучей 3 ГБ, permgen 256 МБ и даже некоторыми дополнительными затратами может потреблять 6,9 ГБ? Ошибка в JVM, которая будет исправлена обновлением до сборки # 35? Что-то не хватает того, что в Java может использовать дополнительную память? Просто пытаюсь увидеть, видел ли кто-нибудь это раньше.

Ответы на вопрос(3)

Ваш ответ на вопрос