Garbage collection: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Recupero di 2 fonte/i e segnalazione di 0 link interrotto/i. #IABot (v1.6.4) |
m Bot: orfanizzo Heap, come da discussione al Progetto Connettività |
||
Riga 73:
==== Naïve mark-and-sweep ====
Nel ''mark-and-sweep'' ogni oggetto in memoria possiede un [[flag]], in genere è sufficiente un [[bit]], riservato esclusivamente per l'utilizzo del Garbage Collector. Quando l'oggetto viene creato, il [[flag]] viene posto in stato, ''flag clear''<ref name=":0">Trad.Ing.:"''Non in uso''"</ref>. Durante la prima fase, o '''fase di Mark''' del ciclo di Garbage Collection, viene scansionato l'intero set di [[Root (informatica)|root]], ponendo ogni oggetto in stato di ''flag set.''<ref name=":1">Trad.Ing.:"''In Uso''"</ref> Tutti gli oggetti accessibili dalla radice del set sono anch'essi contrassegnati come in stato di ''flag set''.<ref name=":1" /> Nella seconda fase, o '''fase di Sweep''', ogni oggetto in memoria viene ancora una volta esaminato; quelli che hanno ancora il ''flag clear''<ref name=":0" /> non sono raggiungibili da nessun programma o dato, e la loro memoria viene quindi liberata. Per gli oggetti che sono marcati flag set, il flag viene posto in stato ''flag clear''<ref name=":0" />, preparandoli per il prossimo ciclo di Garbage Collection.
Questo metodo ha diversi svantaggi, per esempio, l'intero sistema viene sospeso durante la Garbage Collectio in modo non sempre prevedibile e per periodi di tempo non determinabili a priori; questo tipo di comportamento può creare notevoli problemi in ambienti che necessitano di basse [[Latenza|latenze]] di risposta o in [[Real-time|sistemi real-time]] o mission critical, con possibili malfunzionamenti, [[deadlock]], e arresti che possono compromettere l'intero sistema. Inoltre, tutta la memoria di lavoro deve essere esaminata, minimo due volte, causando potenzialmente problemi nei sistemi a [[memoria virtuale|memoria paginata]].
Riga 100:
* Non è necessario ulteriore tempo macchina per recuperare lo spazio liberato dagli oggetti irraggiungibili, l'intera regione viene così considerata libera. Viceversa un Garbage Collector in ''non movimento'' deve controllare ogni oggetto irraggiungibile e registrare che la memoria da essi occupata sia disponibile.
* Dal momento che grandi regioni contigue della memoria sono generalmente messe a disposizione dalla strategia di ''Garbage Collector in movimento'', i nuovi oggetti possono essere attribuiti semplicemente incrementando una locazione di memoria. Una strategia di non movimento invece può, dopo qualche tempo, portare ad una struttura dei dati ([[Heap (informatica)|heap]]) fortemente frammentata, struttura che richiede una consultazione più frequente dei piccoli blocchi di memoria disponibili, al fine di allocare questi nuovi oggetti.
* Oggetti che fanno riferimento l'uno all'altro spesso possono essere spostati in locazioni di memoria adiacenti, aumentando la probabilità che questi si trovino sulla stessa linea della [[cache]] o della pagina di [[RAM|memoria virtuale]]. Questo accelererà notevolmente l'accesso ai nuovi oggetti attraverso i riferimenti.
Riga 157:
== Reference counting ==
Il Reference counting, o conteggio dei riferimenti, è una forma di gestione automatica della memoria, dove ogni oggetto ha un conteggio del numero di riferimenti ad esso. Il contatore è incrementato quando viene creato un riferimento all'oggetto e diminuisce quando un riferimento viene distrutto. La memoria dell'oggetto viene recuperata quando il conteggio si azzera.
Line 167 ⟶ 166:
== Escape Analisys ==
La Escape Analisys può essere utilizzata per spostare le locazioni di memoria dallo heap allo stack o ai registri della CPU, riducendo così la quantità di lavoro che deve essere svolta dal garbage collector. Lo spostamento è lecito quando il riferimento all'oggetto non sopravvive alla subroutine in cui è stato dichiarato, cioè quando il riferimento è a tutti gli effetti una variabile locale, che non viene passata ad ulteriori subroutine o ritornata a monte.
==Esempio (Java)==
<source lang="java">
|