1 / 35

Coleta de resíduos

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

gail-lane
Télécharger la présentation

Coleta de resíduos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Coleta de resíduos

  2. 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

  3. 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

  4. 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

  5. Coleta de resíduos

  6. Métodos de coleta de resíduos • Contador de referências • Marcação e varredura • Parada e cópia • Marcação e compactação

  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

  8. Contador de referências Object p = new Integer (57); Object q = p; Object p = new Integer (57); Object q = new Integer (99); p=q;

  9. 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; }   ou if (p != q) { if (p != null) if (--p.refCount == 0) heap.release (p); p = q; if (p != null) ++p.refCount; }

  10. 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

  11. Contador de referências Object p = new Association (new Integer (57), new Integer (99));

  12. Contador de referências • Referência circulares • Anula-se a lista mas os objetos permanecem referenciados

  13. 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

  14. Método de Marcação e Varredura Algoritmo for 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);

  15. 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

  16. Método de Marcação e Varredura

  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ória • Sempre 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

  19. Método de Parada e Cópia • Algoritmo básico for each root variable r r = copy (r, inactiveHeap); swap (activeHeap, inactiveHeap);

  20. 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;

  21. Método de Parada e Cópia

  22. 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

  23. Método de Marcação e Compactação • Algoritmo básico for each root variable r mark (r); compact ();

  24. Exemplo de uso de handle

  25. Método de Marcação e Compactação • Algoritmos void 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);

  26. 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 livres • Usando um pequeno número de grandes blocos para satisfazer a maioria das requisições muitos blocos de tamanho moderado permanecem sem fragmentação • A 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 exemplo

  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

  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.

More Related