Baixe o app para aproveitar ainda mais
Prévia do material em texto
Coleta de lixo e o outro tipo de Heap A região de memória no qual os objetos são alocados dinamicamente é muitas vezes chamado de heap . No contexto de coleta de lixo, o significado do termo heap está é mais semelhante à sua definição no dicionário: “pilha de muitas coisas”. O que é lixo? Nem sempre uma linguagem fornece os meios para destruir um objeto explicitamente. Linguagens que suportam a destruição explícita de objetos requerem um programa para controlar os objetos que podem ser destruídos. Se um objecto não é destruído, a memória ocupada por esse objeto não pode ser utilizada novamente. Um programa que não controla a memória inutilizada pode esgotar o espaço disponível, impossibilitando a criação de novos objetos. Um objeto não utilizado é chamado de lixo e o processo de encontrar todos os objetos não utilizados e liberar espaço na memória é chamado de coleta de lixo. Reduzir Um programa que cria todos os objetos necessários no início da sua execução e usa os mesmos objetos até que ele também termina não cria lixo, reduzindo ou eliminando a necessidade de recolha de lixo. Reuso Através da reutilização de uma única instância de objeto, a quantidade de lixo produzida é reduzida. Reciclar Essa estratégia deve ser utilizada com cuidado, pois incumbe o trabalho de controle de objetos ao desenvolvedor. Em vez de deixar um objeto não utilizado para o coletor de lixo, ele é armazenado em uma lista de de objetos não utilizados. Quando um novo objeto é necessário, a lista é pesquisada primeiro para ver se um um não utilizado já existe, o que reduz a sobrecarga de lixo. Ajudando o Coletor de Lixo Para evitar que o coletor de lixo seja executado com muita frequência, deve-se criar lixo o suficiente para que a coleta seja feita poucas vezes, ajudando o coletor de lixo. Contador de referência A dificuldade na coleta de lixo é de encontrar o lixo primeiramente. Um objeto é considerado lixo quando não existem referências a esse objeto. O algoritmo primeiro conta as referências que apontam para aquele endereço de memória, se o contador for igual a zero significa que é lixo, pois não há nada apontando pra quele endereço, então a memória é liberada. A vantagem de usar contagens de referência é que o lixo é facilmente identificado. Não é necessário esperar até que haja memória suficiente antes de iniciar o processo de coleta de lixo. Marca varra O lixo é acumulado até que toda a memória disponível foi esgotado. Primeiro se suspende a execução do programa, depois varre as memórias e faz uma marcação, adicionando um campo booleano em cada objeto, nos espaços que estão sendo utilizados. Depois volta pra varrer novamente, o que está marcado desmarca-se, o que não está marcado é liberado, pois é lixo. O armazenamento alocado para os objetos desmarcados é recuperado durante a varredura. Os objetos que um programa pode acessar diretamente são aqueles objetos que são referenciados por variáveis locais na pilha do processador, e devem ser acessíveis. A principal vantagem do algoritmo é que ele recolhe todo o lixo. E a desvantagem é que o programa deve ser suspenso. Para e copia Nesse algoritmo, a pilha é dividida em duas regiões separadas: ativa (ocupada) e inativa (desocupada). Quando a memória na região ativa está esgotada, o programa é suspenso e o algoritmo de coleta de lixo é invocado. Todos os objetos utilizados da região ativa são copiados para a inativa, e as referências dos objetos são atualizadas. Após a cópia for concluída, as regiões trocam seus papéis. Como apenas os objetos utilizados foram copiados, o lixo foi deixado pra trás. Então o espaço ocupado pelo lixo é recuperado de uma só vez quando a região ativa torna-se inativa. O algoritmo desfragmenta automaticamente o heap. As desvantagem do algoritmo é o alto processamento e e ele requer o dobro da memória que o programa realmente usa. Marca e compacta A primeira fase é chamada a marca de fase. Na segunda fase, o algoritmo compacta a heap movendo todos os objetos em locais de memória contínuas. A segunda fase é chamada fase de compactação. Primeiro, as identificações dos objetos são armazenados em uma pilha handle. Depois, quando os objetos são movidos, apenas a handle é modificada, deslizando as referências aos objetos para uma das extremidades. Os objetos permanecem inalterados.
Compartilhar