2010-11-19 12 views
6

c'è un modo per verificare se un oggetto può essere recuperato dal garbage collector?Verifica se l'oggetto può essere recuperato dal garbage collector

Da qualche parte nel mio codice ho ottenuto un riferimento a un oggetto:

MyObject mo = myObject; 

Poi, via Eclipse Debugger, ho la locazione di memoria oggetti. In seguito, ho impostato il nulla di riferimento:

mo = null; 

C'è un modo per verificare se l'oggetto in precedenza riferimento è ora adatto per la raccolta dei rifiuti o se c'è da qualche parte un altro riferimento ad esso?

Grazie mille,

Stefan

risposta

13

Non è possibile farlo in fase di esecuzione con un oggetto arbitrario e infatti non è completamente possibile farlo in modo deterministico. Tuttavia, ci sono due opzioni che possono essere adatti a seconda delle esigenze:

  1. Prendete un heap dump dopo aver impostato il riferimento a null, e poi caricarlo in uno strumento analizzatore mucchio, come jhat o un profiler che supporta questo. Questi strumenti dovrebbero consentire di attraversare il percorso dalle radici del GC e quindi verificare se il tuo oggetto è ancora raggiungibile o meno.
  2. Avvolgere l'oggetto in un PhantomReference con un dato ReferenceQueue. Quando il riferimento è accodato, si sa che l'oggetto è stato garbage collection. (Sfortunatamente, se il riferimento non è univoco, potrebbe essere perché l'oggetto è ancora raggiungibile, o potrebbe essere perché il GC non ha ancora ispezionato l'oggetto. Come in tutte le domande relative al GC, la garbage collection non è un processo deterministico!)

Nel complesso, però, sono d'accordo che l'opzione migliore è quella di essere a conoscenza di problemi di perdita di memoria e progettare l'applicazione per evitarli. Se si dispone di una perdita di memoria dovrebbe essere abbastanza ovvio, e quindi è possibile concentrare le energie sulla ricerca del problema (ancora eseguendo il dumping e analizzando l'heap per gli oggetti che sono erroneamente raggiungibili).

I passaggi sopra riportati sono relativamente lunghi e non dovrebbero essere qualcosa che fai dopo ogni modifica solo per rassicurarti, ma piuttosto sono gli strumenti che utilizzeresti per investigare su un problema specifico .

+0

è un'applicazione huuuuuuuuuuuuuge, dove abbiamo riscontrato problemi di memoria. una ottimizzazione dovrebbe ora portare a miglioramenti, ma non tanto quanto ci aspettavamo. quindi vorremmo sapere se gli oggetti specifici sono spazzatura raccolti. grazie per la tua risposta, lo proverò! – swalkner

+0

Corretto si otterrà una spazzatura pura: D – delive

1

No. L'unica cosa da fare è stare attenti e tenere a mente che le perdite di memoria possono esistere in Java quando si scrive l'applicazione.

L'unica cosa che puoi fare è usare gli strumenti per cercare di scoprire da dove provengono le perdite di memoria quando hai notato un problema simile. Consiglio vivamente lo Memory Analyzer per questo scopo.

+0

grazie per la vostra risposta! ovviamente stare attenti è la cosa più importante, ma a volte non è sufficiente o possibile (vedi risposta a andrzey doyle) – swalkner