Garbage Collection

Equipe:
T03 - Antonio Yuri e Moacir Xavier

curbside.JPG

Introdução

Antes de começar a falar propriamente dito do Garbage Collection, vamos falar primeiro do Gerenciamento de memória.

O Gerenciamento de memória é um recurso utilizado pelo Sistema Operacional – SO para melhor utilizar o espaço de memória presente num computador. Basicamente consiste em duas tarefas:
Alocação: Quando o Gerenciador é requisitado para disponibilizar um bloco de memória para o programa.
Reciclagem: Quando o Gerenciador alocou um bloco de memória, mas esses dados não foram solicitados há algum tempo, e o Gerenciador resolve reciclar este espaço.

Como o aumento dos espaços de memória e requisições de alocação por parte de programas, ficou difícil e um tanto quanto complicado por parte do SO conhecer quanto manter ou não um bloco de memória em atividade. Com isso foram criados alguns mecanismos para o auxilio nesse processo, sendo ele automática ou manual como Emm386.exe , Himem.sys, Smartdrv.exe, Paginação, First-fit, Best-fit, Worst-fit, Next-fit, Garbage Collection o qual será abordado a seguir.


Garbage Collection

Garbage Collection ou Collector, (GC) ou Reciclagem Automática de Memória - como o próprio nome já diz, é o Coletor de Lixo, um processo que é usado para o gerenciamento automático de memória dos Sistemas Computacionais. Nada mais é do que um “faxineiro” de blocos de memória.

Numa forma manual de gerenciamento de memória nos deparamos com um problema bem especifico na execução de sistemas que é o vazamento de memória.

Com o tempo, alguns programas começam a deixar “lixo” no sistema, ou seja, espaço na memória que não será mais utilizado, essa situação pode ocasionar na chamada perda de memória que se refere a um espaço de memória previamente alocado e não mais referenciado, veja os exemplos:

Img1

Ao contrário do que ocorre em algumas linguagens como em C++, em Java o GC foi implementado de uma forma que fosse usado automaticamente, assim que ele encontra algum objeto para o qual não existe mais referencia, a área de memória onde está alocado o objeto é marcada para desalocação, por isso, em Java, não ocorrem problemas do tipo, liberação de recurso ainda em uso e esgotamento de memória.

Mas, como na informática na maioria das vezes uma solução gera novos problemas, o GC, gera uma desaceleração inesperada do sistema que não pode ser prevista pelo programador, por ser um processo de alta prioridade e demorado, o impacto causado pelo GC é sentido por todo o sistema.

Por causa desta situação os contrários a tecnologia Java pregam que a possibilidade de ser usada em sistema de tempo real seja nula.


Forçando a Coleta de Lixo

Em algumas linguagens é possível gerenciar o GC, ordenando o momento da execução da coleta do lixo, o .NET é uma delas.

Dentro do namespace System está localizada a classe responsável pelo uso do coleto, chamada de “GC”, ela oferece uma gama de opções para que o programado possa trabalhar com o GC.

Caso em determinado momento o programa tenha usado bastante memória, trabalhando manipulando bastante objetos, criando objetos, e com isso o programador deseje iniciar o processo de coleta, ele simplesmente invoca o método estático Collect() dentro da System da classe GC
System.GC.Collect();


Ponte entre Garbage Collection e um Compilador

O compilador, um software básico que traduz uma entrada em uma saída, neste momento não importa qual é a entrada ou qual é a saída, mas sim, dizer que o compilador "traduz", ou seja, gera algo correspondente, mantendo a equivalência de significados e mantendo apenas as informações relevantes.

Podemos dizer que neste ponto existe a aproximação do Compilador com o GC, pois basicamente ele faz isso, gera um espaço de memória equivalente ao que lhe foi dado de inicio, mas mantendo apenas as informações necessárias, mantendo a equivalência de significados.

Em outro momento o GC se assemelha muito ao funcionamento do compilador em uma de suas etapas no processo de compilação de um código fonte, que é a parte de “Otimizador de Código”. Etapa essa que compreende entre o gerador de código intermediário e o gerador de código final. O Otimizador de Código ele aprimora de forma automática o código gerado pelo “gerador intermediário” retirando partes desnecessárias para que o código seja executado de forma mais eficiente, ai a semelhança com o GC. O GC também funciona de forma automática eliminando informações em desuso da memória, assim como o Otimizado de Código ambos trabalham em pro do bom funcionamento do programa tornado-o assim mais eficiente sua execução.


Aula da Berkeley Universidade da California

Uma aula do professor Jonathan Shewchuk


Referências

http://www.linhadecodigo.com.br/Artigo.aspx?id=568
http://pt.wikipedia.org/wiki/Coletor_de_lixo
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
http://pt.wikipedia.org/wiki/Gerenciamento_de_mem%C3%B3ria
http://www.guj.com.br/article.show.logic?id=106
Apostila Caelum Java FJ-11@@

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License