Upload
gail-lane
View
19
Download
1
Embed Size (px)
DESCRIPTION
Coleta de resíduos. Sumário. Resíduos Coleta de resíduos Contador de referências Marcação e varredura Parada e cópia Marcação e compactação Gerenciamento dinâmico de memória. Resíduo. Um objeto é uma instância de uma classe ou de um array - PowerPoint PPT Presentation
Citation preview
Coleta de resíduos
Sumário
Resíduos
Coleta de resíduos Contador de referências Marcação e varredura Parada e cópia Marcação e compactação
Gerenciamento dinâmico de memória
2
Resíduo
Um objeto é uma instância de uma classe ou de um array
Heap – região de memória onde os objetos são alocados dinamicamente (não é o heap árvore)
A memória alocada a cada objeto contém espaço para administração da memória
3
Resíduos
Programas contém objetos e referencias a objetos
Quando existem referencias a objetos que não mais existem ocorre um vazamento de memória
Objetos que não são mais referenciados são chamados de resíduos
O procedimento de Coleta de resíduos é invocado quando o total de memória alocada atinge determinado patamar Usualmente o programa é suspenso enquanto se faz a coleta de
resíduos
Para facilitar a coleta de resíduos deve-se atribuir null a toda variável referenciando objetos não mais necessários
4
Coleta de resíduos
Métodos de coleta de resíduos
Contador de referências
Marcação e varredura
Parada e cópia
Marcação e compactação
6
7
Método do Contador de Referências
Cada objeto possui um campo contador que armazena o número de ponteiros (internos e externos) que apontam para este objeto
Toda vez que o ponteiro para um objeto é atualizado os contadores de referências dos objetos para os quais o ponteiro apontava e passou a apontar são atualizados
Toda vez que o contador de referências de um objeto se torna nulo este objeto pode ser devolvido à coleção de objetos livres
Contador de referênciasObject p = new Integer (57);Object q = p;
Object p = new Integer (57);Object q = new Integer (99);p=q;
8
Contador de referências
Implementações do contador de referências para p = q;
if (p != q){
if (p != null)
--p.refCount;
p = q;
if (p != null)
++p.refCount;
}
ouif (p != q)
{
if (p != null)
if (--p.refCount == 0)
heap.release (p);
p = q;
if (p != null)
++p.refCount;
}
9
Contador de referências
Na referência a objetos que referenciam outros objetos o problema se complica
Quando o primeiro objeto receber valor null os objetos referenciados permanecerão como resíduos até o coletor de resíduos recolher o primeiro objeto
10
Contador de referências
Object p = new Association (new Integer (57), new Integer (99));
11
Contador de referências
•Referência circulares•Anula-se a lista mas os objetos permanecem referenciados
12
Método de Marcação e Varredura
Objetos não referenciados são marcados
A coleta de resíduos é feita posteriormente
Objetos referenciados diretamente por variáveis do programa são chamados de raízes (roots)
Objetos acessíveis indiretamente são ditos vivos
Demais objetos são resíduos
A marcação de objetos requer um atributo booleano marked
13
Método de Marcação e Varredura
Algoritmofor each root variable r mark (r);sweep ();
void mark (Object p) if (!p.marked) p.marked = true; for each Object q referenced by p mark (q);
void sweep () for each Object p in the heap if (p.marked) p.marked = false else heap.release (p);
14
Método de Marcação e Varredura
Objetos são criados com marked false
O processo de marcação atribui true a marked para objetos acessívies ou vivos
O processo de varredura coleta os objetos com marked false e atribui false a marked dos objetos que permaneceram acessíveis
15
Método de Marcação e Varredura
16
17
Método de Parada e Cópia
Fragmentação A alocação e deslocação de memória, ou seja, a atribuição
de trechos de memória a processos é feita em blocos de memória de tamanhos requisitados pelos respectivos processos
A natureza dinâmica dessas ocorrências faz com que, em geral a memória fique fragmentada intercalando blocos alocados e blocos livres
A fragmentação pode provocar a impossibilidade do atendimento de uma solicitação pela inexistência de um bloco livre no tamanho desejado muito embora o somatório das áreas livres fragmentadas supere o tamanho solicitado
18
Método de Parada e Cópia
No método de Parada e Cópia o heap é dividido em duas regiões activeHeap inactiveHeap
Considera-se disponível o espaço inactiveHeap entre o final do último bloco de memória alocado e o final da memóriaSempre que uma solicitação de memória ultrapassa o espaço disponível: Interrompe-se o processamento Objetos vivos são copiados da região ativa para a inativa As regiões ativa e inativa trocam seus papéis Verifica-se então a possibilidade de atendimento da solicitação
Método de Parada e Cópia
• Algoritmo básicofor each root variable r
r = copy (r, inactiveHeap);
swap (activeHeap, inactiveHeap);
19
Método de Parada e Cópia
void Object copy (Object p, Heap destination)
if (p == null)
return null;
if (p.forward == null)
q = destination.newInstance (p.class);
p.forward = q;
for each field f in p
if (f is a primitive type)
q.f = p.f;
else
q.f = copy (p.f, destination);
q.forward = null;
return p.forward;
20
21
Método de Parada e Cópia
Método de Marcação e Compactação
• A referência a objetos pode ser implementada por meio de manipuladores (“handles”)
• Cada objeto tem seu handle• Handle contém
• Referência a uma instância da classe do objeto• Ponteiro para região do heap aonde o objeto reside• Flag marked
• Quando a posição do objeto no heap modifica é necessário apenas atualizar o ponteiro do handle pois todas as referências ao objeto são feitas ao handle
22
Método de Marcação e Compactação
• Algoritmo básicofor each root variable r
mark (r);
compact ();
23
Exemplo de uso de handle
24
Método de Marcação e Compactação
• Algoritmosvoid mark (Object p)
if (!handle[p].marked)
handle[p].marked = true;
for each Object q referenced by p
mark (q);
void compact ()
long offset = 0;
for each Object p in the heap
if (handle[p].marked)
handle[p].object = heap.move (p, offset);
handle[p].marked = false;
offset += sizeof (p);
25
Gerenciamento dinâmico de memória
27
Gerenciamento dinâmico de memória
O processo de alocação de blocos de memória pode ser feito de diversas maneiras, tais como: Primeiro ajuste Melhor ajuste Pior ajuste
28
Primeiro ajuste
A lista de blocos livres é percorrida seqüencialmente até encontrar o primeiro bloco livre cujo tamanho seja maior ou igual do que a quantidade de memória requisitada
29
Melhor ajuste
O método busca o menor bloco livre cujo tamanho seja maior do que ou igual à quantidade de memória requisitada
30
Pior ajuste
O método consiste na alocação de uma porção do maior bloco livre constante da lista de blocos livresUsando um pequeno número de grandes blocos para satisfazer a maioria das requisições muitos blocos de tamanho moderado permanecem sem fragmentaçãoA não ser no caso da maioria de requisições de memória em grandes blocos, o método do pior ajuste satisfaz a um maior número de requisições do que os outros métodos
31
Primeiro exemplo
1) Considere-se a situação na qual existem blocos livres com tamanhos 200, 300 e 100 unidades de memória.
Deseja-se alocar blocos de memória com os tamanhos 150, 100, 125, 10 e 100 unidades. A seqüência de alocação, pelos diversos processos é a seguinte.
32
Primeiro exemploEspaços Processo da Pior Escolha Livres Solicitações
150 100 125 100 100 200 200 100 100 0 0 300 150 150 25 25 25 100 100 100 100 100 0
Espaços Processo da Primeira Escolha Livres Solicitações
150 100 125 100 100 200 50 50 50 50 Não pode 300 300 200 75 75 Não pode 100 100 100 100 0 Não pode
Espaços Processo da Melhor Escolha Livres Solicitações
150 100 125 100 100 200 50 50 50 50 Não pode 300 300 300 175 75 Não pode 100 100 0 0 0 Não pode
33
Segundo exemplo
2) Considere-se a situação na qual existem blocos livres com tamanhos 110 e 54 unidades de memória.
Deseja-se alocar blocos de memória com os tamanhos 25, 70 e 50 unidades. A seqüência de alocação, pelos diversos processos é a seguinte.
34
Segundo exemplo
Espaços Processo da Primeira Escolha
Livres Solicitações 25 70 50
110 85 15 15 54 54 54 4
Espaços Processo da Melhor Escolha
Livres Solicitações 25 70 50
110 110 40 Não pode 54 29 29 Não pode
Espaços Processo da Pior Escolha Livres Solicitações
25 70 50 110 85 15 15
54 54 54 4
35
Gerenciamento dinâmico de memória
O método do primeiro ajuste é mais eficiente se a lista de blocos disponíveis for mantida em ordem crescente de endereços de memória. Caso a lista seja mantida em ordem crescente de tamanho de bloco a busca por melhor ajuste se torna mais eficiente. Caso a lista seja mantida em ordem decrescente de tamanho de bloco o método do pior ajuste é o mais eficiente.Todavia não é prático manter a lista de blocos disponíveis classificada por tamanho. Na ausência de outras considerações ou especificações é usual se dar preferência ao método do primeiro ajuste.