Por que o processo do Java VM consome mais RAM do que o especificado no parâmetro -Xmx?

5

Tenho vários servidores executando o CentOS 5.4 e apenas um aplicativo em execução no Java VM. Eu configurei o Java VM com os seguintes argumentos:

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

As máquinas nas quais estou executando a VM tem 6 GB de RAM e não há outros aplicativos em execução. Depois de um tempo, o processo de java começa a bater no espaço de swap muito difícil, eu recebo essa informação do comando 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 conectar via JConsole, ele informa que o Java VM tem 2,6 GB usados, 4,6 GB confirmados e 4,6 Gb max.

java -version retorna:

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

Por que a VM Java está se expandindo muito além do tamanho de heap alocado? E para onde vai essa memória, se não for reportada no JConsole?

    
por evilpenguin 12.05.2010 / 11:57

2 respostas

0

Eu tenho notado um bug em alguns aplicativos comerciais baseados em Java, onde o aplicativo é bem comportado em Java de 32 bits, mas requer um extra (e principalmente desnecessário) 1.25GB apenas para iniciar o Java de 64 bits. Então, o que leva 256MB em 32bit Java leva 1,5GB em um tempo de execução de 64 bits.

Eu suspeito que o Java esteja relatando o que ele acha que o aplicativo está usando, mas não o seu próprio overhead de tempo de execução, particularmente no caso em que esse bug é invocado.

Você pode tentar executar o aplicativo em um tempo de execução de 32 bits ou voltar para o suporte técnico do fornecedor (pode custar $$) e perguntar o que está acontecendo.

Por fim, se você conseguir limitar o consumo total de memória, basta forçar o aplicativo a travar mais cedo, e você ainda terá um problema.

    
por 12.05.2010 / 15:24
2

-Xmx é a quantidade máxima de espaço de heap sendo usado pela vm. Não inclui memória para as classes carregadas, a própria VM ou pilhas de threads ou a memória usada para o JIT, por exemplo. A linha de cima também é enganosa, uma vez que o primeiro número incluía a memória compartilhada que é usada por outros programas também. O segundo número de 3.9g é o tamanho do residente e mais próximo da realidade.

Minha recomendação: verifique se você realmente precisa de muito heap (número e tamanho de objetos) e reduza o número -Xmx, se puder.

    
por 16.07.2010 / 17:11