2010-03-31 18 views
5

Utilizzo un caricatore classe personalizzato che estende URLClassLoader. Carico alcune classi nel mio caricatore di classi personalizzato ed eseguo alcune attività. Una volta completata l'attività, voglio disporre del caricatore di classe. Ho provato a farlo impostando il riferimento a null.smaltimento di un caricatore classe

Ma questo non raccoglie spazzatura il caricatore di classe.

C'è un modo che può aiutare ciò che voglio raggiungere?

+0

Vedere http://stackoverflow.com/questions/148681/unloading-classes-in-java/148707#148707 –

+0

Non _quite_ la stessa domanda, questa riguarda lo scaricamento del classloader piuttosto che delle classi caricate. –

+1

Il mio primo consiglio sarebbe quello di verificare cosa rende le classi all'interno del classloader non recuperabili. Fai un dump e analizza le dipendenze delle classi in attesa del tuo classloader. –

risposta

2

Da ClassLoader doc: Every Class object contains a reference to the ClassLoader that defined it. Ciò impedisce il ritiro del tuo caricatore. Dovresti annullare tutti i riferimenti alle classi e alle istanze di quelle classi.

3

Fondamentalmente, come già sottolineato @invariant, il dereferenziazione di tutte le classi caricate dallo specifico programma di caricamento classi dovrebbe rendere questo garbage collector classloader. Tuttavia, c'è (almeno) un'eccezione: se una classe è serializzata, quella classe (e quindi il suo classloader) viene mantenuta referenziata internamente da ObjectStreamClass, che è una classe primordiale e quindi non viene mai raccolta. Quindi, in questo caso, il classloader non può essere sottoposto a garbage collection finché l'intera JVM non termina.

Vedere la spiegazione completa here, nella sezione "Problemi relativi alla garbage collection e alla serializzazione".

0

Fintantoché tutte le classi caricate da questo classloader sono referenziate, il programma di caricamento classi non verrà raccolto automaticamente. Quindi il classloader verrà rimosso se: vengono annullati tutti i riferimenti diretti al classloader, tutti i riferimenti alle classi caricate da questo classloader e alle istanze di queste classi. Quindi può essere scaricato alla prossima esecuzione del garbage-collector.

1

ClassLoader verrà raccolto dopo che non ci sono più istanze di classi create da ClassLoader. C'è un vecchio bug (4950148) relativo al fatto che non esiste un modo per disporre esplicitamente di un ClassLoader, che causa problemi ad esempio con il blocco dei file.

Questo è stato ora fixed in JDK 7 che aggiunge un metodo URLClassLoader.close().

Problemi correlati