
Quando un programma viene avviato, viene messa a disposizione, da parte del computer, una certa quantità di memoria. Questa viene allocata principalmente per 4 diverse componenti:
- una prima area di memoria è dedicata a contenere le istruzioni stesse del programma;
- una seconda area di memoria è dedicata alle variabili che non sono definite nei metodi, ma che appartengono alla classe intera e servono generalmente per l’esecuzione del programma, le cosiddette variabili globali;
- un’area di memoria, denominata heap, viene dedicata a tutti gli oggetti che non occupano una quantità di memoria definita, ma invece necessitano di una quantità di memoria dinamica, come ad esempio i reference type;
- un’ultima area di memoria, denominata stack, viene dedicata alle informazioni relative alle chiamate e ai value type che non ricadono nelle variabili globali, ovvero quelle variabili proprie dei metodi (e non genericamente della classe stessa) che necessitano di una quantità ben definita di memoria.
Vedendo nel dettaglio l’area di memoria stack, essa è composta da diversi “settori” denominati stack frame. Ad ogni chiamata di un metodo viene istanziato uno stack frame dedicato, dove vengono registrate tutte le informazioni:
- variabili value type istanziate in quel metodo;
- parametri utilizzati;
- indirizzo di ritorno al metodo chiamante.
La gestione degli eventi nella memoria stack, ovvero dell’aggiunta e dell’eliminazione degli stack frame, avviene secondo lo schema “last in, first out” che sostanzialmente consiste nell’esecuzione degli stack frame partendo dalla chiamata più recente per tornare poi a ritroso al primo metodo chiamato (solitamente il main), in maniera uguale e contraria a come avvengono le chiamate nell’esecuzione effettiva del programma.
Se un programma eccede la dimensione massima consentita (che è pari a 1 GB nei programmi in windows a 32 bit e a 4 GB nei programmi in windows a 64 bit), ad esempio quando viene chiamato un programma ricorsiva un numero eccessivo di volte, viene prodotta una StackOverflowException ed il programma viene, di conseguenza, interrotto.