Guia Linguagem Java

Garbage Collection: Entendendo e otimizando - Parte 1

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (4)  (0)

O artigo trata de explicar fundamentos e detalhes sobre o processo de Garbage Collection em Java, apresentar o funcionamento dos collectors da JVM HotSpot 6 e 7 e como otimizar seu comportamento por meio de opções da JVM.

Artigo no estilo Curso

De que se trata o artigo:

O artigo trata de explicar fundamentos e detalhes sobre o processo de Garbage Collection em Java, apresentar o funcionamento dos collectors da JVM HotSpot 6 e 7 e como otimizar seu comportamento por meio de opções da JVM.

Em que situação o tema útil:

O tema é muito pertinente a qualquer desenvolvedor Java, pois por mais que as consequências de um processo de Garbage Collection mal configurado não apareçam muito em ambiente de desenvolvimento, certamente farão a diferença em ambiente de produção, e é importante entender os motivos que levam ao comportamento indesejado do Garbage Collection quando submetido a múltiplos processadores e grandes quantidades de dados.

Resumo DevMan:

O artigo apresenta conceitos e métricas de Garbage Collection em Java, além da categorização da memória heap em generations. Em seguida, apresenta a JVM HotSpot 6 e seu funcionamento geral com relação à Garbage Collection, assim como a sua personalização através de opções da JVM. A partir daqui, explica sobre cada collector, seu funcionamento, suas opções de personalização e suas implementações, fazendo também um comparativo final mostrando quando é mais adequado utilizar cada um dos collectors disponíveis. Ainda, apresenta a JVM HotSpot 7 e seu novo collector, seu funcionamento e opções de personalização.

Um assunto constantemente deixado de lado atualmente, porém de extrema importância, é a devida configuração do processo de Garbage Collection. É comum de se ver pouco esforço quanto a este respeito, e assim aparecem muitas consequências que seriam evitáveis em um processo de Garbage Collection bem configurado.

Tipicamente, é incomum ver um desenvolvedor que se preocupe o suficiente com isto, pois é muito provável que seu ambiente de desenvolvimento não possua as mesmas necessidades que um ambiente de produção, e desta forma ele não sente bem os flagelos causados por um Garbage Collection mal configurado: as famigeradas pausas e demoras.

Todavia, é possível otimizar a maioria dos cenários, visto que cada aplicação tem uma maneira única quanto à utilização de memória, sendo assim possível buscar as configurações a serem utilizadas para obter-se o máximo possível do processo de Garbage Collection.

A intenção deste artigo é demonstrar aos desenvolvedores a importância de entender e otimizar o processo de Garbage Collection. Assim, faz-se necessário um estudo preliminar sobre os conceitos e algoritmos disponíveis em diferentes versões da Java Virtual Machine (JVM) mais conhecida atualmente, a JVM HotSpot, o que será abordado neste primeiro artigo da série “Entendendo e otimizando o Garbage Collection”.

Conceitos de Garbage Collection em Java

A linguagem Java possui gerenciamento automático de memória, controlando sua alocação e desalocação. A desalocação de memória é suportada pelo processo conhecido por Garbage Collection.

Esta abordagem difere-se das linguagens tradicionais como C++, onde a memória dinâmica é alocada e desalocada explicitamente, o que costumava ser problemático devido à utilização de ponteiros de memória, o que possibilita problemas como vazamentos de memória e bugs de ponteiros para regiões da memória que continham objetos que já foram desalocados.

Em Java, a alocação e desalocação de memória acontece de maneira automática, controlada e transparente ao desenvolvedor, substituindo a utilização de ponteiros de memória por referências de objetos, evitando assim os vazamentos de memória e bugs de ponteiros. Desta forma, a linguagem Java é considerada mais segura neste aspecto.

Em contrapartida, este gerenciamento automático de memória consome recursos computacionais quanto à decisão sobre a desalocação, fato já sabido pelo desenvolvedor que realizava isto explicitamente em C++. Além disso, este processo é não-determinístico, ou seja, não há garantias sobre quando acontecerá a desalocação, se ela vier a acontecer.

Antes de explicar mais detalhes sobre este processo, eis alguns conceitos iniciais:

· Memória heap: espaço reservado pela JVM para a alocação de objetos em memória. Toda alocação de objeto em Java é realizada na memória heap. Da mesma forma, toda vez que um objeto é desalocado, a memória utilizada por este retorna como memória disponível para a heap;

· Collection: processo automático de gerenciamento da memória heap, baseado em duas atividades: busca de objetos que não são mais acessíveis, e desalocação dos recursos utilizados por estes objetos;

· Collector: algoritmo que realiza uma collection;

· Throughput (vazão): porcentagem de tempo de execução não utilizada em collections, ou seja, teoricamente é o total de tempo de execução disponível para a aplicação, considerado sobre longos períodos de tempo;

· Pausa: momento de tempo onde a aplicação fica não-responsiva porque uma collection está acontecendo.

Tipicamente, throughput e pausa representam um trade-off em Garbage Collection, ou seja, quanto mais esforço se investe em maximizar o throughput, menos se tem em minimizar o tempo de pausa, e vice-versa.

Em determinadas situações, a existência de pausas não caracteriza um problema crítico, como por exemplo em um servidor web, onde o cliente já está ciente que precisará esperar por uma resposta, e assim as pausas de Garbage Collection podem ser disfarçadas pela latência de rede, de maneira que o usuário não consiga perceber que a demora aconteceu por causa de Garbage Collection. Assim, uma boa ideia seria utilizar um collector que busque maximizar o throughput da aplicação.

Em outras situações, a existência de pausas representa um problema crítico, como por exemplo em uma aplicação gráfica e interativa, onde mesmo pequenas pausas serão percebidas pelo usuário e podem afetar sua experiência com a aplicação. Assim, uma boa ideia seria utilizar um collector que busque minimizar o tempo de pausa.

O gráfico da Figura 1, obtido do website da Oracle, representa a porcentagem de throughput"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?