Understanding Garbage Collector

Description

70-483 C# Flashcards on Understanding Garbage Collector , created by Thiago Russo on 15/05/2017.
Thiago Russo
Flashcards by Thiago Russo, updated more than 1 year ago
Thiago Russo
Created by Thiago Russo almost 7 years ago
3
0

Resource summary

Question Answer
visão geral sobre gerenciamento de memória, recursos gerenciados e não gerenciados Em algumas linguagens como C ++, vc tem q se preocupar c/ o gerenciamento de memória. Precisa usar ponteiros e gerência de memória sempre q possível. Esquecer de liberar algum recurso de memória pode resultar em um vazamento de memória. C# é uma linguagem gerenciada q utiliza um coletor de lixo para liberar memória sempre que necessário. Se vc usar apenas objetos gerenciados, o coletor de lixo (garbage collector) libera vc de se preocupar com o gerenciamento de memória . No entanto, mtas vezes precisamos utilizar recursos n gerenciados, como conexões de BD ou manipular arquivos. Ao lidar com essas situações, vc precisa liberar esses recursos o + rápido possível.
Existem dois lugares em memória onde o CLR armazena itens enquanto o seu código é executado. Qdo vc cria um obj, como string, int, ou um tipo customizado, vc sabe que de alguma forma o .NET Framework aloca memória e coloca o objeto na mesma. Na maioria das vezes, isso acontece completamente nos bastidores (pelo CLR) e vc n precisa se preocupar. Existem dois lugares em memória onde o CLR armazena itens enquanto o seu código é executado. Uma delas é a stack ; o outro é o heap
stack x heap De forma simplificada: - stack mantém o controle do q está executando em seu código e - heap mantém o controle dos objetos. Tipos valor podem ser armazenados em ambas (stack e heap). Para um objeto no heap, há sempre uma referência na stack que aponta para ele. Objetos grandes vão para uma parte especial do heap. Mas, basicamente, esta é a distinção entre os dois tipos de memória.
como é realizada a limpeza dessas duas áreas de memória? stack e heap A limpeza da stack é automática no final de um método. O CLR cuida disso e vc não tem que se preocupar. A heap é outra história: é gerenciado pelo coletor de lixo. Em ambientes n gerenciados sem um coletor de lixo, vc tem que manter o controle de quais objetos foram alocados na heap e vc precisa liberá-los explicitamente. No .NET Framework, isso é feito pelo garbage collector.
garbage collector (GC) como funciona? O GC funciona c/ uma marcação (mark) e um algoritmo de compactação. A fase de marcação (mark) de uma coleção verifica quais itens no heap ainda estão sendo referenciados por um item de raiz (root item), que pode ser um campo estático, um parâmetro do método, uma variável local, ou de um registo de CPU. Se o coletor de lixo encontra um item "vivo" na heap, ele marca o item. Depois de verificar toda a heap, a operação compacta inicia. O GC em seguida, move todos os obj "vivos" próximos na heap e libera a memória para todos os outros objetos. Para fazer isso, o GC tem q certificar de q nenhum status está mudando durante a execução de toda a marcação e compactação. Devido a isso, todas Threads são congelados ao fazer uma operação de coleta. Ele também tem q se certificar de q todas as referências a obj vivos estão corretas. Depois de mover os obj, o coletor de lixo corrige todas as referências existentes para objetos.
GC afeta o desempenho? O processo do GC citado no outro card pode ter um grande impacto no desempenho. Qdo vc está executando uma operação importante e complexa q deve retornar para o usuário o + rápido possível e de repente o GC entra em ação, vc tem q esperar até que ele termine . Felizmente o GC é inteligente. Ele começa a limpeza apenas qdo n houver espaço suficiente na heap para construir um novo objeto (ou qdo o Windows sinaliza q está com falta de memória). Então, desde q haja espaço suficiente na memória, vc n vai notar nada sobre coleta de lixo. E qdo isso acontecer, ele tenta fazer isso em um momento em q o uso do aplicativo é baixo.
Quando a coleta de lixo for iniciada, ela recolhe apenas Generation 0 (zero). O que isso significa? Ao executar uma limpeza, itens q sobrevivem (pq ainda estão referenciados) são promovidos a uma "geração maior" (higher generation). Eles são objs de vida + longa e o GC faz a suposição de q os objs de vida + longa, provavelmente ficarão + tempo. Devido a isso, o GC foca sobre os objs na geração 0 (generation 0). Eles são apenas criados e provavelmente serão desnecessários em uma pequena quantidade de tempo. As outras gerações serão tocados somente qdo o coletor de lixo não pode liberar memória suficiente para limpar Geração 0. Em resumo, é assim que a coleta de lixo funciona: Ela remove itens da heap que não são mais necessários e garante que nenhum obj pode permanecer vivo e ocupar memória se ele n estiver em uso.
Show full summary Hide full summary

Similar

Porova teórica C# mod l
Cursos Professor Jonatã
Linguagem C#
Alex Araujo Furado
Prova teorica C# mo ll
Cursos Professor Jonatã
Entity framework - code first
José Fernandes
Flashcard Módulo 1 - XAMARIN LATINO AMERICA
Marcone Barbosa
Entity framework
José Fernandes
C# and ASP.NET
Kalebi Fiorentini
Linguagens de programação
Rodrigo Barbosa7452
Conceitos do ASP.NET CORE (Incompleto)
José Fernandes Rezende Neto
Dates and times .NET
Felipe Couto Viola
Fluxo Game UC 8
Lucas Coluzzo