2013-06-15 20 views
5
ArrayList<Object> foo; 
Object[] bar; 

finalizzatori tipici farannoJava finalizzatori, quali compiti sono realmente necessari

foo = null; 
bar = null; 

La mia domanda, sarà ArrayList chiamare un wich finalizzatore imposta tutti i puntatori che detiene a nulla, o devo fare un passo attraverso il elencare un do

for(i=1; i<foo.size(); i++) foo.set(i,null); ??? 

E l'altra domanda: per una serie, ho bisogno di impostare qualsiasi dei suoi contenuti a nulla, come

for(i=1; i<bar.length; i++) bar[i] = null; 

o è sufficiente che l'intero blocco di memoria viene scartato e qualsiasi puntatore fuori del campo di applicazione dopo?

Siamo spiacenti, se la domanda è stupida.

Dopo aver letto le risposte ho capito, che non c'è nulla di implementare lì da soli.

Alcune fonti suggeriscono che se una cosa del genere (applicazioni di memoria di mangiare) accade, che questo è di cattivo design.

La mia domanda principale è: fare spesso

struct = new LargeStructure(); 

fa questa memoria exaust?

O questo solo bisogno il ricordo di una di queste strutture?

proposito: Il problema occours in un gatto esecuzione webapp, e c'è solo goduto una sessione attiva tiene il puntatore descritto come variabile di sessione.

risposta

4

Tutti gli oggetti potranno beneficiare di GC da collettore di immondizia automaticamente quando non sono più referenziati. Non devi preoccuparti di questo. Se stai impostando il riferimento dell'array su null, allora l'oggetto array è idoneo per GC se non ci sono altri riferimenti live all'oggetto array, gli elementi dell'array saranno idonei per GC se non ci sono più riferimenti attivi ad essi .

Come per il documentation:

protected void finalize() throws Throwable 

Chiamato dal garbage collector su un oggetto quando garbage collection determina che non vi sono altri riferimenti all'oggetto. Una sottoclasse sovrascrive il metodo finalize per eliminare le risorse di sistema o eseguire altre operazioni di pulizia.

Procedimento finalize() sarà chiamato dopo il GC rileva che l'oggetto non è più raggiungibile, e prima recupera effettivamente la memoria utilizzata dall'oggetto. Se l'oggetto non diventa mai irraggiungibile o il GC non viene eseguito, è possibile che non venga mai chiamato finalize().

Si può provare di forzare la JVM di chiamare finalize() chiamando System.runFinalization():

esegue i metodi finalizzazione di eventuali oggetti in attesa di finalizzazione.

si chiama questo metodo suggerisce che la Java Virtual Machine sforzo expend verso eseguendo i metodi Finalize degli oggetti che sono stati trovati ad essere scartato, ma il cui finalizzare i metodi non sono ancora stati eseguiti. Quando il controllo ritorna dalla chiamata al metodo, la Java Virtual Machine ha compiuto il massimo sforzo per completare tutte le finalizzazioni in sospeso.

+0

se imposto foo = null; willl qualsiasi sottostruttura i riferimenti vengono automaticamente cancellati o rimarranno nella memoria – user715484

+0

Ho capito i finalizzatori come una routine, che imposta tutte le sotto strutture su null per renderle elegibili per la garbage collection – user715484

+0

Speravo davvero di poter risolvere un problema con grandi strutture dati che non vengono liberate. – user715484

0

Non è necessario impostare i riferimenti del tuo oggetto al null nel blocco finalizzatore. I Finalizer sono tipicamente utilizzati per la chiusura dell'ultima risorsa, non è una buona pratica, ma i finalizzatori possono fornirti una rete di sicurezza per la gestione delle risorse.

1

I finalizzatori teorici consentono di eseguire attività dell'ultimo minuto sull'oggetto prima che vengano recuperate dalla procedura di garbage collection. In pratica, tuttavia, non vi è alcuna garanzia che vengano chiamati, quindi non sono molto utili.

0

La mia domanda, sarà ArrayList chiamare un wich finalizzatore imposta tutti i puntatori che detiene a nulla, o devo per scorrere l'elenco di fare

ArrayList non chiamare un finalizzatore, un filo finalizzatore lo farò, ma non devi preoccupartene. Inoltre, non è necessario andare oltre una lista e finalizzare i propri elementi. Java Garbage Collector lo capirà e selezionerà quegli oggetti fino a quando non saranno referenziati da nessun'altra parte nel codice.

E l'altra domanda: per una serie, ho bisogno di impostare qualsiasi dei suoi contenuti a NULL, come

No, come sopra. Una cosa importante da ricordare è che non si ha alcun riferimento a nessun valore nell'array, o all'array stesso se si vuole che venga raccolto dal garbage collector.

Problemi correlati