DanPir ha scritto:
Vuoi dire che il GC potrebbe liberare spazio nella memoria heap andando ad eliminare un oggetto che potrebbe essere "utilizzabile" in futuro ma che al momento non è utilizzato ?
No, alt. Un oggetto è "eleggibile" per il garbage collector quando NON è più "raggiungibile". Attenzione: "raggiungibile" è diverso dall'essere "referenziato". Due oggetti possono referenziarsi tra di loro in ciclo ma essere entrambi non raggiungibili. E il g.c. li prenderebbe in considerazione entrambi.
Il concetto del "raggiungibile" riguarda il fatto di poter tracciare un cammino verso l'oggetto partendo da un insieme noto di "radici". Se l'oggetto è raggiungibile, NON può essere toccato dal g.c.
DanPir ha scritto:
Per quanto riguarda la seconda parte: di conseguenza la porzione di memoria riservata allo stack non viene mai liberata fino al termine dell'esecuzione del programma ? So che è al limite dell'impossibile, ma questo non potrebbe generare problemi di memoria ?
Innanzitutto lo stack non è uno solo. Ogni thread ha il SUO proprio stack. E all'interno di uno stack ci sono
N "frame". Dove ogni frame rappresenta la invocazione di un metodo, con le sue variabili locali e altro.
Quindi più thread esistono, più stack ci sono e di conseguenza potenzialmente "molta" memoria occupata. Ma quando un thread termina/sparisce, pure il suo stack sparisce!