coleta de resíduos
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 PresentationTRANSCRIPT
![Page 1: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/1.jpg)
Coleta de resíduos
![Page 2: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/2.jpg)
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
![Page 3: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/3.jpg)
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
![Page 4: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/4.jpg)
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
![Page 5: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/5.jpg)
Coleta de resíduos
![Page 6: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/6.jpg)
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
![Page 7: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/7.jpg)
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
![Page 8: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/8.jpg)
Contador de referênciasObject p = new Integer (57);Object q = p;
Object p = new Integer (57);Object q = new Integer (99);p=q;
8
![Page 9: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/9.jpg)
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
![Page 10: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/10.jpg)
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
![Page 11: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/11.jpg)
Contador de referências
Object p = new Association (new Integer (57), new Integer (99));
11
![Page 12: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/12.jpg)
Contador de referências
•Referência circulares•Anula-se a lista mas os objetos permanecem referenciados
12
![Page 13: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/13.jpg)
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
![Page 14: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/14.jpg)
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
![Page 15: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/15.jpg)
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
![Page 16: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/16.jpg)
Método de Marcação e Varredura
16
![Page 17: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/17.jpg)
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
![Page 18: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/18.jpg)
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
![Page 19: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/19.jpg)
Método de Parada e Cópia
• Algoritmo básicofor each root variable r
r = copy (r, inactiveHeap);
swap (activeHeap, inactiveHeap);
19
![Page 20: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/20.jpg)
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
![Page 21: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/21.jpg)
21
Método de Parada e Cópia
![Page 22: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/22.jpg)
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
![Page 23: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/23.jpg)
Método de Marcação e Compactação
• Algoritmo básicofor each root variable r
mark (r);
compact ();
23
![Page 24: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/24.jpg)
Exemplo de uso de handle
24
![Page 25: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/25.jpg)
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
![Page 26: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/26.jpg)
Gerenciamento dinâmico de memória
![Page 27: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/27.jpg)
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
![Page 28: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/28.jpg)
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
![Page 29: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/29.jpg)
29
Melhor ajuste
O método busca o menor bloco livre cujo tamanho seja maior do que ou igual à quantidade de memória requisitada
![Page 30: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/30.jpg)
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
![Page 31: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/31.jpg)
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.
![Page 32: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/32.jpg)
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
![Page 33: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/33.jpg)
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.
![Page 34: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/34.jpg)
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
![Page 35: Coleta de resíduos](https://reader038.vdocuments.pub/reader038/viewer/2022110211/56813498550346895d9b8bbc/html5/thumbnails/35.jpg)
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.