Gerenciamento de Memória Java



 

Os principais conceitos em Java Management: Estrutura da Memória JVM e Trabalho do coletor de lixo.

A JVM define várias áreas de dados de tempo de execução que são usadas durante a execução de um programa. Algumas das áreas são criadas pela JVM, enquanto outras são criadas pelos encadeamentos usados em um programa. No entanto, a  área de memória criada pela JVM é destruída apenas quando a JVM é encerrada. As áreas de dados do encadeamento são criadas durante a instanciação e destruidas quando o encadeamento é encerrado.

Partes da área de memória:

 Pilha - É uma área de dados de tempo de execução compartilhada e armazena o objeto real em uma memória. Ele é instanciado durante a inicialização da máquina virtual. Essa memória é alocada para todas as instâncias de classe e array. O heap pode ser de tamanho fixo ou dinâmico, dependendo da configuração do sistema. A JVM fornece o controle do usuário para inicializar ou variar o tamanho do heap conforme o requisito. Quando uma nova palavra-chave é usada, o objeto recebe um espaço no heap, mas a referência do mesmo existe na pilha.

 Área do Método - É uma parte lógica da área do heap e é criada na inicialização da máquina virtual. Essa memória é alocada para estruturas de classe, dados de método e dados de campo do construtor, e também para interfaces e métodos especiais usados na classe. O heap pode ser de tamanho fixo ou dinâmico dependendo da configuração do sistema. Pod ser de tamanho fixo ou expandido conforme exigido pelo cálculo. Não precisa ser contíguo.

Nota: Embora a área do método seja logicamente uma parte do heap, ela pode ou não ser coletada como lixo, mesmo que a coleta de lixo seja obrigatória na área do heap.

Pilhas JVM - Uma pilha é criada ao mesmo tempo em que uma thread é criada e é usada para armazenar dados e resultados parciais que serão necessários ao retornar o valor para o método e realizar a vinculação dinâmica. As pilhas podem ser de tamanho fixo ou dinâmico. O tamanho de uma pilha pode ser escolhido independentemente quando ela é criada. A meméria para a pilha não precisa ser contígua.

Método nativo Pilhas - Também chamadas de pilhas C, as pilhas de métodos nativos não são escritas na linguagem Java. Essa memória é alocada para cada thread quando é criada. E pode ser de natureza fixa ou dinâmica.

Resgistradores do contador de programa (PC) - Cada thread da JVM que executa a tarefa de um método específico possui um registro de contador de programa associado a ele. O método não nativo possui um PC que armazena o endereço da instrução JVM disponível enquanto que no método nativo o valor do contador de programa é indefinido. O registrador do PC é capaz de armazenar o endereço de retorno ou um ponteiro nativo em alguma plataforma específica.

Trabalho de um coletor de lixo:

A JVM aciona esse processo e conforme o processo de coleta de lixo na JVM é feito ou então retido, reduz a carga do programador ao realizar automaticamete a alocação ou desalocação de memória. O processo de coleta de lixo faz com que o restante dos processos ou threads seja pausado e, portanto, é caro por natureza. Esse problema é inaceitável para o cliente, mas pode ser eliminado aplicando vários algorítimos baseados em coletor de lixo. Este processo de aplicação de algoritimo é muitas vezes denominado como ajuste do Coletor de Lixo e é importante para melhorar o desempenho de um programa. Outra solução são os coletores de lixo geracionais que adicionam um campo de idade aos objetos que recebem uma memória. À medida que mais e mais objetos são criados, a lista de lixo aumenta, aumentando assim o tempo de coleta de lixo. Com base em quantos ciclos de clock os objetos sobreviveram, os objetos são agrupados e recebem uma 'idade' de acordo. Dessa forma, o trabalho de coleta de lixo é distribuído.

Nota: System.gc() e Runtime.gc() São os métodos que solicitam a coleta de lixo para a JVM explicitamente, mas não garantem a coleta de lixo, pois a decisão final da coleta de lixo é apenas da JVM.

Saber como o programa e seus dados são armazenados ou organizados é essencial, pois ajuda quando o programador pretende escrever um código otimizado em termos de recursos e consumo. Também ajuda a encontrar os vazamentos de memória ou inconsistências e ajuda na depuração de erros relacionados à memória. No entanto, o conceito de gerenciamento de memória é extremamente vasto e, postanto, deve-se dar o seu melhor para estudá-lo o máximo possível para aprimorar o conhecimeto do mesmo.

E então, gostou do conteúdo? Comenta aí!
Para saber mais sobre Java veja A História do Java e também o post Porque Java

Forte abraço e até o próximo post!

 

Comentários

Postagens mais visitadas deste blog

Programação Orientada A Objetos

Entenda os tipos em Java