Scritta la classe, mi piacerebbe sapere quanti oggetti sono allocati.
come posso fare (tenendo conto anche di quelli deallocati dal garbage collector)?
Scritta la classe, mi piacerebbe sapere quanti oggetti sono allocati.
come posso fare (tenendo conto anche di quelli deallocati dal garbage collector)?
Forza e onore
una variabile statica all'interno della classe che viene incrementata quando si chiama il costruttore della classe.
Per decrementare implementi un distruttore... dovresti se non sbaglio fare l'override del metodo finalize(), ma non vorrei sbalgiare.
ciao ciao
Ehm, in effetti è quella la mia difficoltà, contare quelli deallocati...
Grazie cmq.
Forza e onore
Ciao Premeier,
probabilmente il tuo problema nel contare oggetti deallocati è vincolato al fatto che il Garbage collector decide se deallocare o meno gli oggetti che fanno parte o meno di uno o più thread e penso che questo capiti anche se tu invochi il metodo finalize in maniera esplicita nel tuo listato.
Allora un'idea sarebbe quella di avere sempre la variabile statica per il conteggio, fare l'override del metodo finalize aggiungendo il decremento di detta variabile e poi invocare direttamente il garbage collector.
Per invocare il garbage collector può esserti utile:
http://www.devdaily.com/java/edu/pj/...08/index.shtml
Sinceramente non so se il mio suggerimento può aiutarti a risolvere il tuo problema![]()
Ciao
Ecco un esempio di utilizzo di finalize():
Notare che finalize è protected (ed è giusto che sia così) e notare che System.gc() è solo un "suggerimento" per la JVM.codice:public class Prova { public static void main (String[] args) { MyObj o1 = new MyObj (); MyObj o2 = new MyObj (); MyObj o3 = new MyObj (); System.out.println (MyObj.getCount ()); o1 = null; System.gc (); System.out.println (MyObj.getCount ()); o2 = o3 = null; System.gc (); System.out.println (MyObj.getCount ()); } } class MyObj { private static int count; public MyObj () { count++; } protected void finalize () { count--; } public static int getCount () { return count; } }
In realtà ci sarebbero molte altre cose che si possono fare ma qui si entrerebbe in un argomento molto più complesso. In Java un oggetto si può trovare in uno dei seguenti 6 stati:
- reachable
- unreachable
- resurrectable
- softly-reachable
- weakly-reachable
- phantomly-reachable
I primi 3 stati esistono in Java da sempre, gli ultimi 3 sono stati introdotti con Java 1.2. Mentre per i primi 3 stati il programmatore ha solo un controllo parziale su di essi, per i 3 stati aggiuntivi il programmatore ha un controllo completo. È così possibile, ad esempio, implementare un sistema di "caching" degli oggetti o altre cose.
Ma qui, ripeto, si va verso cose un pochino più complesse ....
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet