Gerenciamento de memória JAVA

Gerenciando de memória

Um item muito importante a ser considerado quando falamos de servidores (JVM) é a memória, pois existem três divisões a serem consideradas. Veja a ilustração:

De forma resumida, um processo Java, é na verdade uma JVM, que consome memória do sistema operacional. Esta memória se divide em três principais utilidades:

· Stack ou Code Cache: porção de memória é variável, que é utilizado pelo processo Java para gerenciar os aplicativos e funcionalidades feitos em Java que estão sendo executados pelo servidor (JVM). É um espaço utilizado para compilação é aqui que fica nativo, feito especificamente para o sistema operacional;

· Área permanente (Permanent Generation): onde são armazenadas informações para o carregamento de classes e métodos. Este memória pode ter um valor máximo, mas não necessariamente irá utilizar todo ele;

· Heap: é a área de memória onde todas as instâncias são criadas e armazenadas. Também é compartilhada por todas as threads. Ele pode ter um tamanho fixo ou um valor mínimo e máximo (existem alguns JDK que trabalham agressivamente e têm como tamanho máximo toda a memória disponível numa máquina física).

Dica:

Um erro é muito comum, no momento de dimensionar o tamanho da memória, é definir o tamanho do HEAP igual ao total de memória disponível, ou, quando existem vários servidores numa máquina, a soma de todos os HEAP é maior que total de memória disponível. Um processo Java consome em média entre 15% e 35% de memória além do HEAP.

Devemos deixar ao menos 35% de memória disponível, mesmo somando todos os HEAP, não esquecendo de somar também a memória consumida pelo sistema operacional.