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
- 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.
- 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
- 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ó.
- 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ó
Disposeper 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#.
Curs de Programació en C#
Mòdul 1: Introducció al C#
- Introducció al C#
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
Mòdul 2: Estructures de Control
Mòdul 3: Programació Orientada a Objectes
Mòdul 4: Conceptes Avançats de C#
- Interfícies
- Delegats i Esdeveniments
- Genèrics
- Col·leccions
- LINQ (Consulta Integrada al Llenguatge)
- Programació Asíncrona
Mòdul 5: Treballant amb Dades
Mòdul 6: Temes Avançats
- Reflexió
- Atributs
- Programació Dinàmica
- Gestió de Memòria i Recollida d'Escombraries
- Multifil i Programació Paral·lela
Mòdul 7: Construcció d'Aplicacions
Mòdul 8: Millors Pràctiques i Patrons de Disseny
- Estàndards de Codificació i Millors Pràctiques
- Patrons de Disseny
- Proves Unitàries
- Revisió de Codi i Refactorització
