Per ogni applicazione eseguita sul sistema operativo, questβultimo assegna una quantitΓ di RAM nella quale si trovano due zone distinte: gli stack e lo heap.
In particolare il SO assegna uno stack ad ogni thread dellβapplicazione (viene quindi assegnato alla creazione del thread e eliminato al suo termine), mentre lo heap Γ¨ unico (viene creato al lancio dellβapplicazione e eliminato alla sua chiusura).
La dimensione dello heap viene decisa al lancio dellβapplicazione ma puΓ² aumentare in base allo spazio necessario.
Dato che vi Γ¨ un unico heap per tutti i thread dellβapplicazione, questo deve essere thread-safe: ogni allocazione e deallocazione nello heap deve essere sincronizzata.
Dato un metodo da eseguire, nello stack verranno inseriti le variabili βpassate per valoreβ che verranno eliminate al termine del metodo stesso, mentre nello heap le variabili βpassate per riferimentoβ che invece rimarranno nella memoria anche al termine del metodo.
Queste ultime dovranno essere eliminate da un agente interno (Dispose manuale) o esterno (Garbage Collector).
Lo stack Γ¨ notevolmente piΓΉ veloce di un heap in quanto il modello di accesso rende banale lβallocazione e la deallocazione della memoria da esso (un puntatore viene semplicemente incrementato o decrementato, vi Γ¨ una operazione di push e pop che occupa unβistruzione macchina), mentre lβheap deve avere una gestione molto piΓΉ complessa per lβallocazione o deallocazione che coinvolge il sistema operativo.
Per approfondire stack, heap e altri concetti fondamentali consiglio questo bellissimo articolo: https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types