• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Info Gestione automatica della memoria

Mi.ke

Utente Master
Autore del topic
16 Giugno 2011
2.857
60
Miglior risposta
0
Salve, sinceramente non sapevo se bisogna etichettarla come guida o come informazione, fatto sta' che sono qui per parlarvi della Gestione automatica della memoria.

La gestione della memoria si occupa di tutti i problemi legati all'assegnazione della memoria per le variabili e gli oggetti. I lnguaggi di programmazione gestiscono la memoria in modi diversi: ci sono linguaggi che lasciano questo compito al programmatore e altri che rendono il più possibile trasparente la gestione della memoria.

Tra i compiti di un gestore della memoria, oltre all'allocazione, vi è la deallocazione. Un buon gestore deve essere in grado di mantenere libera più memoria possibile per assegnarla quando ne verrà fatta richiesta.
Java mette a disposizione un gestore automatico della memoria che si occupa di tutti i compiti legati all'allocazione e deallocazione della memoria. Il programmatore interagisce con questo gestore solo quando usa l'oeratore new per creare nuovi oggetti.
Quando un oggetto viene creato, viene allocata la memoria di cui ha bisogno. Questa memoria varia a seconda del numero di attributi di cui è composto. Mentre l'oggetto viene utilizzato, la memoria resta riservata. Quando un oggetto non è più usato, la memoria dovrebbe essere deallocata e resa disponibile per altri oggetti.
In Java la deallocazione è eseguita in modo automatico.
Una parte impostante dell'interprete Java è il Garbage Collector (letteralmente, raccoglitore di spazzatura): è un sistema automatico che si preoccupa di recuperare le parti di memoria inutilizzae per metterle a disposizione del programma. Il garbage Collector tiene traccia dello stato di tutti gli oggetti: quando si accorge che un certo oggetto non viene più usato, interviene per liberare la memoria occupata e renderla disponibile.

Questo modo di gestire la memoria presuppone che il Garbage Collector resti attivo durante tutta l'esecuzione di un applicazione Java. E' quindi un esempio di PROCESSO CONCORRENTE, che viene eseguito in sincronia con un altro programma.
Il vantaggio di avere un gestore di memoria automatico si traduce in una semplificazione del linguaggio e nell'eliminazione di errori di programmazione dovuti alla gestione dei puntatori alla memoria.

Il gestore della memoria può stabilire che un oggetto non è più utilizzato contando il numero di riferimenti a quell'oggetto.
Si consideri per esempio l'istruzione:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Essa crea un riferimento a un oggetto di classe String. L'oggetto ha un solo riferimento contenuto in S.


Le seguenti istruzioni creano altri riferimenti all'oggetto:

String s1= s;
String s2= s;

Un oggetto che possiede riferimenti può essere utilizzanto e quindi deve erestare allocato in memoria. Quando il numero di riferimento a quell'oggetto è = a 0, quindi non si utilizza più, ed è qui che entra in gioco il Garbage Collector.
La memoria occupata da tutti gli oggetti non più accessibili può essere liberata per altri utilizzi.

Il garbage collector controlla costantemente gli oggetti per verificare se il numero dei riferimenti di essi è = 0.

GLi oggetti non possono essere distrutti dal programmatore: la deallocazione viene fatta in modo automatico dal Garbage Collector. Quello che può fare il programmatore è impostare tutti i riferimenti ad un particolare oggetto con il valore "null".

I metodi costruttori vengono eseguiti quando un nuovo oggetto viene istanziato.
Esistono altri metodi, che vengono richiamati automaticamente prima che un oggetto venga eliminato.
Quando un oggetto non è più usato, e prima che il garbage collector provveta, alla sua eliminazione viene eseguito un metodo particolare. chiamato finalizzatore.

Questo metodo è utile per eseguire le azioni che evitino una brusca eliminazione dell'oggetto.
Tra queste ci sono le operazioni di chiusura di eventuali file aperti dall'oggetto.
La dichiarazione di un finalizzatore avviene sovrascrivendo il metodo finaliza, che è un metodo della classe Object e quindi viene ereditato da tutti gli oggetti. Il metodo deve essere dichiarato in questo modo:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Va bene. Abbiamo finito, spero vi sia di utile apprendimento, e' un argomento molto importante che può essere utile nel caso della programmazione di un Videogames o comunque qualsiasi altro programma di livello professionale.

:bye:
Alla prossima.
 
@Noyz Herb Ottima guida , anche se oltre al metodo finalize , java ci permette di controllare la memoria libera e Forzare il Garbage Collector o eseguire la finalizzazione degli oggetti in attesa (Ovviamente è un operazione che va fatta solo quando necessitiamo di un uso continuo di memoria e non possiamo attendere i normali tempi di "pulizia") .Per esempio Runtime espone metodi per il controllo di spazio disponibile e spazio concesso alla Jvm (freeMemory()-totalMemory())

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
 
  • Like
Reactions: 1 person