Como vimos em Tamanho do HEAP (-Xms -Xmx), temos algumas opções de como configurar a memória que uma aplicação JAVA irá utilizar.
Caso deseje conhecer como funciona o Gerenciamento de memória clique no link e veja os detalhes.
Agora vamos falar um pouco sobre como configurar o tamanho ideal de um HEAP.
Primeiro temos que mostrar alguns comportamentos do JAVA:
- HEAP pequeno: Irá disparar o coletor de lixo com muito frequência;
- HEAP muito grande: O coletor de lixo irá ocorrer em menor frequência, mas as pausas serão longa, pois demora limpar muita memória;
- Se o HEAP utilizar mais memória que a memória livre (disponível):Todos os sistemas operacionais têm uma área chamada de SWAP, que utiliza parte do disco rígido como memória, isto deixará a aplicação extremamente lenta;
- Tamanho mínimo e máximo iguais (Xms = Xmx): Evita alocação ou liberação de memória do HEAP, mas pode causar maior fragmentação.
Não queremos que a aplicação perca tempo coletando lixo a todo momento, muito menos que esta coleta leve muito tempo. Isto nos deixa com uma equação difícil de resolver. Esta equação muda de acordo com o tipo de aplicação e os recursos por ela utilizados.
Não existe uma fórmula que se aplicará para qualquer JVM, pois existem aplicações que não utilizam muita memória, mas precisam de muita performance, já há outras que suportam grandes pausas do coletor de lixo (entende mais em Coletor de lixo (Garbage Collector)).
Podemos tirar algumas conclusões:
- HEAP Pequeno com Xmx > Xms: Será utilizada em aplicações que não geram grande quantidade de objetos em memória, nem utilizam matrizes imensas, geralmente são aplicações que fazem atividades simples e repetitivas, tais como rotinas de verificação, execução em JAVA de processos em lote e afins;
- HEAP grande com Xmx > Xms: Aplicação que realizam processos sofisticados e complexos e, para isto utilizam muita memória;
- Xmx = Xms: Para ambientes com bastante memória disponível, pois evita que o GC realize alocações ou liberações de memória e aumenta o período entres as pausas, mas causará pausas mais longas. Muito utilizadas em aplicações Web.
Agora você deve estar imaginando, li tudo isto, li os links acima, mas ainda não sei o tamanho de memória que devo criar o meu HEAP. Neste ponto necessitaremos de todo o conhecimento acima, pois como disse, não há uma regra.
A melhor maneira de definir o tamanho de um HEAP é deixar um Xms bem pequeno, 500Mb ou menos e um Xmx bem grande, bem perto do total de memória disponível. Então a aplicação deve ser exercitada, utilizando alguma ferramente que simule usuários ou utilizando usuário reais e monitorar o consumo de memória ao longo de algumas horas. Para isto será necessário conhecer qual é pico de usuários que a aplicação espera de forma simultânea ou um valor estimado, pois será importante no processo de configuração.
Normalmente realizamos estes testes em três fases:
- Teste baixo: em ordem sequencial, todas as páginas serão acessadas, apenas uma vez e consulta serão realizadas apenas uma vez com apenas uma combinação, pois existem tela de pesquisa com filtros que permitem uma gama imensa de possibilidades, basta testar um caso e nem precisa se o pior;
- Teste médio: Este teste deve simular a aplicação como se estive em uso, ou seja, com vários usuários simultâneos (ou alguma ferramenta que simule isto), e acessar as principais funcionalidades muitas vezes em paralelo e as menos importantes esporadicamente;
- Teste em carga máxima (momento de pico): Toda a aplicação, ou a maioria delas, é construída para suportar um momento de pico, memento de maior concentração de utilização.
Durante estes três etapas deverão ser colhidas alguns dados:
- Quantas pausas o GC fez;
- Fragmentação da memória;
- Quanto o Xms cresceu e quanto tempo levou para crescer;