Configurando o espaço de memória das áreas Heap e Perm da JVM
Veja neste artigo como funcionam as áreas de memória da Java Virtual Machine (JVM) conhecidas como Heap e Perm.
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.
Saiba mais: Introdução ao Java Virtual Machine (JVM)
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.
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:
- 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;
- 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;
- 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.
Saiba mais: Introduzindo o servidor de aplicação Apache Tomcat
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:
- -Xms: Tamanho inicial do espaço alocado para a Heap;
- -Xmx: Tamanho máximo do espaço alocado para a Heap;
- -XX:PermSize: Tamanho inicial do espaço alocado para a Perm;
- -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).
Logo em seguida, você deverá acessar a aba Arguments, tal como mostra a Figura 3.
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.
Saiba mais: Introdução ao Eclipse Che
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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Vídeo