quarta-feira, 18 de março de 2009

OutOfMemory na cabeça

Tem muita gente resolvendo problema de memória do tomcat, aplicações com arquivos JNLP e servidores de aplicações utilizando os parametros PermSize e Heap Size, sem terem ideia o que são e sem saberem que a má utilização podem causar impactos significativos nas aplicações. Passei por isso essa semana e pensei que deve ter muita gente com essa dúvida, simples de resolver, mas que nem todo mundo tem a curiosidade de procurar se informar sobre pra que elas servem.

Quando ocorre um “java.lang.OutOfMemoryError” a primeira coisa que fazemos é procurar no google os valores para serem adicionados aos parametros iniciais dos servidores de aplicações e etc. Os chamados PermSize e Heap Size, mas eu nunca entendi direito o que esses parametros significam. Então vamos lá.

O que é JVM Heap? A memória Heap é aquela alocada para armazenar os objetos(quando utilizado o operador new) e as classes Java em tempos de execução. Podendo ser especificado através do comando -Xms<initial heap size> -Xmx<maximum heap size> tendo como padrão os valores -Xms32m -Xmx128m.

É geralmente uma boa ideia colocar o parametro máximo para memória Heap de 512. Se colocar uma memória muito pequena a memória do servidor é preenchida rapidamente e eventualmente objeto são criados e poderá não ter mais espaço livre para os objetos. Inversamente se colocar um valor muito alto, muitos “junks objects” ficariam na memória e o Garbage Collection poderia levar muito tempo para tentar desalocar esses objetos, podendo causar um impacto na performace da aplicação.

Essa foi a descrição da memória Heap. Outro tipo de memória é a PermGen chamado “Permanent Generation” é um tipo de memória mais pernamente, fixa e não muda quando a VM está executando. Utilizada para carregar as classes java, definições das classes, valores literais String, retorno do método String.intern() entre outras coisas. Pode ser especificada através do comando -XX:MaxPermSize. O padrão é 64m para as Vms da Sun. Quando essa memória não há espaço para carregar todas as classes, acontece o famoso erro “java.lang.OutOfMemoryError: PermGen space failure” que pode ser resolvido aumentando o valor do parametro -XX:MaxPermSize.

Espero te explicado de forma simples os tipos de memórias PermGen e Heap. Até o próximo post.

Nenhum comentário:

Postar um comentário

Postar um comentário