Por que eu devo ler este artigo:

O uso inadequado de configurações da JVM (Java Virtual Machine) pode trazer grandes transtornos a aplicações com grande quantidade de acessos e/ou requisições. Por isso, saber configurar o espaço em memória utilizado pela JVM é essencial para se ter um bom desempenho e poder assegurar um alto nível de SLA (Acordo de Nível de Serviço) para o cliente.

Nesse contexto, a correta configuração de propriedades como -Xms, -Xmx, -XX:PermSize e -XX:MaxPermSize é essencial. Para saber como melhor definir tais opções, analisaremos nesse artigo as diferenças entre elas e como configurá-las de acordo com as necessidades da sua aplicação.

Antes de iniciar a configuração da JVM, é importante conhecer os espaços de memória Heap e Perm, que fazem parte do modelo de divisão de memória especificado por ela. A Figura 1 demonstra essa divisão.

Modelo de Memória da JVM
Figura 1. Modelo de Memória da JVM.

Nessa ilustração, do lado esquerdo, podemos ver o JVM Heap (-Xms -Xms), ou apenas Heap, que armazena os objetos criados pela aplicação. Quando você usa o operador new ou qualquer outro método/técnica que crie um objeto no seu código Java, esse objeto será alocado dentro da Heap. Diretamente relacionado a isso, o termo HeapSize refere-se à quantidade de memória alocada para a Heap.

Já do lado direito, o Perm (-XX:PermSize, -XX:MaxPermSize), ou Perm Gen, armazena as interfaces, classes, métodos e atributos estáticos da aplicação, também conhecidos como metadados. Além disso, de modo semelhante ao termo HeapSize, o termo PermSize também se refere à quantidade de memória alocada para um espaço de memória; nesse caso, para a região Perm.

O termo “Perm Gen” vem de Permanent Generation, ou, em português, Geração Permanente, e refere-se a uma área que carrega itens que não mudarão durante a execução da aplicação, ou seja, são permanentes, diferentemente da área Heap, que pode aumentar de acordo com a quantidade de objetos criados.

Para finalizar a explicação desses conceitos, vejamos um exemplo simples:

  1. Suponha que você tenha uma aplicação com uma classe de nome Venda e um botão “Novo” que criará um novo objeto Venda a cada clique;
  2. Quando você fizer o deploy no servidor de aplicação (JBoss AS, TomEE, GlassFish, etc.), a classe Venda será armazenada na área Perm e a Heap continuará vazia;
  3. Com o servidor já iniciado, quando um usuário fizer o login e clicar no botão “Novo”, um objeto da classe Venda é criado e automaticamente armazenado na área Heap. Se o usuário clicar em “Novo” outra vez, mais um objeto Venda será criado. Assim, teremos dois objetos dessa classe na área Heap e continuaremos com apenas um na área Perm.

Configurando os limites de Heap e Perm

Entendidos os conceitos, podemos configurar tais áreas de memória de acordo com a nossa necessidade. Precisamos, portanto, definir os valores das principais propriedades de configuração de Heap e Perm, que são:

  1. -Xms: Tamanho inicial do espaço alocado para a Heap;
  2. -Xmx: Tamanho máximo do espaço alocado para a Heap;
  3. -XX:PermSize: Tamanho inicial do espaço alocado para a Perm;
  4. -XX:MaxPermSize: Tamanho máximo do espaço alocado para a Perm.

O espaço ideal alocado para a memória Heap da sua aplicação será melhor estimado com o uso constante do sistema, em paralelo a um monitoramento constante do uso dos seus recursos. Esse valor, no entanto, pode sofrer alterações a todo momento, de acordo com o crescimento da aplicação. Sendo assim, normalmente não chegaremos a um valor exato.

Definido o valor, é recomendável que o tamanho inicial da Heap seja igual ou muito próximo ao máximo, pois assim evita-se eventuais paradas para aumento de espaço alocado. Se você define o tamanho inicial da Heap para 10MB e o máximo para 1GB e sua aplicação cria muitos objetos a todo momento, provavelmente você terá uma perda de performance, pois constantemente a área da Heap terá que aumentar para alocar os novos objetos. Se você definir o valor inicial como 1GB e 1GB para o máximo, no entanto, ela já começará com bastante espaço e não haverá necessidade de a JVM expandir esse espaço para suportar novos recursos.

Para ajustar essas propriedades através do IDE Eclipse, acesse as opções de configuração do servidor web (acessível através do menu Window>Show View> Servers) e clique no link Open launch configuration (veja a Figura 2).

Open Launch configuration
Figura 2. Open Launch configuration.

Logo em seguida, você deverá acessar a aba Arguments, tal como mostra a Figura 3.

Nota: Se você estiver trabalhando com uma aplicação desktop, deve clicar com o botão direito do mouse na classe que possui o método main(), acessar Run As>Run Configurations... e, a partir daí, proceder da mesma forma que a apresentada na Figura 3.
Configurações de Heap e Perm através do IDE
Figura 3. Configurações de Heap e Perm através do IDE.

Nessa tela, mais precisamente na área VM arguments, é possível informar os parâmetros de configuração das áreas Heap e Perm. Vejamos um exemplo:

  -Xms512M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m
  

Feito isso, ao iniciar a aplicação, a área Heap terá um espaço fixo de 512MB e a Perm começará com 256MB, podendo crescer até 512MB.


Saiu na DevMedia!

  • Programador Java:
    Aprender Java não é uma tarefa simples, mas seguindo a ordem proposta nesse Guia, você evitará muitas confusões e perdas de tempo no seu aprendizado. Vem aprender java de verdade, vem!

Saiba mais sobre Java ;)

  • Guia Completo de Java:
    Neste Guia de Referência você encontrará todo o conteúdo que precisa para começar a programar com a linguagem Java, a sua caixa de ferramentas base para criar aplicações com Java.