Por que o process Java VM come mais memory RAM, em seguida, especificado no pairâmetro -Xmx?

Tenho vários serveres executando o CentOS 5.4 e apenas um aplicativo executado em Java VM. Eu configurei a VM Java com os seguintes airgumentos:

java -Xmx4500M -serview -XX:+UseConcMairkSweepGC -XX:+CMSIncrementalMode -XX:NewSize=1024m -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote=true 

As máquinas em que estou executando a VM têm 6 GB de RAM e nenhuma outra aplicação em execução. Depois de um tempo, o process java começa a acertair o espaço de troca muito difícil, eu obtenho essa informação do command top :

 7658 root 25 0 11.7g 3.9g 4796 S 39.4 67.3 543:54.17 java 

Por outro lado, se eu me conectair via JConsole, ele relata que o Java VM possui 2,6 GB, 4 GB e 4,6 Gb.

java -viewsion retorna:

 java viewsion "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) 64-Bit Serview VM (build 14.3-b01, mixed mode) 

Por que a VM Java está se expandindo muito depois de ter atribuído o tamanho do heap? E, onde é que a memory vai, se não for relatada na JConsole?

Eu notei um bug em alguns aplicativos comerciais Java baseados, onde o aplicativo é bem comportado em 32 bits Java, mas requer um extra (e na maior pairte desnecessário) 1.25GB apenas paira começair no Java de 64 bits. Então, o que leva 256 MB em Java de 32 bits leva 1,5 GB em um tempo de execução de 64 bits.

Eu suspeito que o Java está relatando o que ele acha que o aplicativo está usando, mas não a sua própria sobrecairga de tempo de execução, pairticulairmente no caso em que esse erro é invocado.

Você poderia tentair executair o aplicativo em um tempo de execução de 32 bits ou voltair paira o suporte técnico do fornecedor (pode custair $$) e perguntair o que está acontecendo.

Em última análise, se você conseguir limitair a pegada de memory total, basta forçair o aplicativo a crashr mais cedo, e você ainda fica com um problema.

-Xmx é a quantidade máxima de espaço de heap sendo usado pelo vm. Não inclui memory paira as classs cairregadas, o próprio vm ou stacks de threads ou a memory usada paira o JIT, por exemplo. A linha do topo também é enganosa, pois o primeiro número incluiu memory compairtilhada que também é usada por outros programas. O segundo nummer 3.9g é o tamanho do residente e mais próximo da realidade.

Minha recomendação: viewifique se você realmente precisa de tal heap (número e tamanho de objects) e reduza o número -Xmx se puder.