La gestió de memòria és un aspecte crucial en la programació, especialment en llenguatges com C# que ofereixen mecanismes automàtics per gestionar la memòria. En aquest tema, explorarem com C# maneja la memòria i com funciona el procés de recollida d'escombraries (Garbage Collection).

Conceptes Clau

  1. Memòria en C#

  • Heap i Stack: C# utilitza dues àrees principals de memòria: el Heap i el Stack.
    • Stack: Emmagatzema variables locals i informació de control de funcions. És una memòria de mida fixa i d'accés ràpid.
    • Heap: Emmagatzema objectes i dades dinàmiques. És una memòria de mida variable i d'accés més lent comparat amb el Stack.

  1. Recollida d'Escombraries (Garbage Collection)

  • Garbage Collector (GC): És un procés automàtic que allibera memòria ocupada per objectes que ja no són accessibles pel programa.
  • Generacions: El GC divideix els objectes en tres generacions per optimitzar el procés de recollida:
    • Generació 0: Conté objectes de vida curta.
    • Generació 1: Conté objectes que han sobreviscut almenys una recollida.
    • Generació 2: Conté objectes de vida llarga.

Funcionament del Garbage Collector

  1. Algorisme de Marcació i Compactació

  • Marcació: El GC marca tots els objectes accessibles.
  • Compactació: Elimina els objectes no marcats i compacta la memòria per reduir la fragmentació.

  1. Triggers del GC

  • El GC s'activa automàticament quan:
    • La memòria disponible és baixa.
    • El Heap està ple.
    • Es crida manualment a GC.Collect() (no recomanat en la majoria dels casos).

Exemples Pràctics

Exemple 1: Creació i Alliberament d'Objectes

using System;

class Program
{
    static void Main()
    {
        // Creació d'un objecte
        MyClass obj = new MyClass();
        
        // Utilització de l'objecte
        obj.DoSomething();
        
        // L'objecte es fa inaccessible
        obj = null;
        
        // El GC pot alliberar la memòria ocupada per l'objecte
        GC.Collect(); // No recomanat en la majoria dels casos
    }
}

class MyClass
{
    public void DoSomething()
    {
        Console.WriteLine("Fent alguna cosa...");
    }
}

Exemple 2: Utilització de using per Alliberar Recursos

using System;
using System.IO;

class Program
{
    static void Main()
    {
        // Utilització de using per alliberar recursos automàticament
        using (StreamWriter writer = new StreamWriter("example.txt"))
        {
            writer.WriteLine("Hola, món!");
        } // El StreamWriter es tanca automàticament aquí
    }
}

Exercicis Pràctics

Exercici 1: Creació i Alliberament d'Objectes

Descripció: Crea una classe Person amb una propietat Name. Crea una instància de Person, utilitza-la i després fes-la inaccessible. Observa com el GC allibera la memòria.

Solució:

using System;

class Program
{
    static void Main()
    {
        Person person = new Person { Name = "John" };
        Console.WriteLine(person.Name);
        
        person = null;
        
        GC.Collect(); // No recomanat en la majoria dels casos
    }
}

class Person
{
    public string Name { get; set; }
}

Exercici 2: Utilització de using per Alliberar Recursos

Descripció: Escriu un programa que llegeixi un fitxer de text utilitzant StreamReader dins d'un bloc using.

Solució:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        using (StreamReader reader = new StreamReader("example.txt"))
        {
            string content = reader.ReadToEnd();
            Console.WriteLine(content);
        } // El StreamReader es tanca automàticament aquí
    }
}

Errors Comuns i Consells

  • No forçar el GC: Evita cridar GC.Collect() manualment, ja que pot afectar el rendiment de l'aplicació.
  • Dispose Pattern: Implementa el patró Dispose per alliberar recursos no gestionats.
  • Memòria no gestionada: Sigues conscient de la memòria no gestionada (com recursos de fitxers o connexions de xarxa) i allibera-la adequadament.

Resum

En aquesta secció, hem après sobre la gestió de memòria en C# i el procés de recollida d'escombraries. Hem explorat com el Garbage Collector allibera memòria automàticament i hem vist exemples pràctics de com gestionar la memòria de manera eficient. A més, hem proporcionat exercicis per reforçar els conceptes apresos. Amb aquests coneixements, estàs preparat per gestionar la memòria de manera efectiva en les teves aplicacions C#.

© Copyright 2024. Tots els drets reservats