I metodi statici (di fatto tutti i metodi) e le variabili statiche sono memorizzati nella PermGen
sezione dell'heap, poiché fanno parte dei dati di riflessione (dati relativi alla classe, non relativi all'istanza).
Aggiornamento per chiarimenti :
Notare che solo le variabili ei loro valori tecnici (primitive o riferimenti) sono archiviati nello spazio PermGen.
Se la tua variabile statica è un riferimento a un oggetto, l'oggetto stesso viene memorizzato nelle sezioni normali dell'heap (giovane / vecchia generazione o spazio dei sopravvissuti). Questi oggetti (a meno che non siano oggetti interni come classi ecc.) Non sono memorizzati nello spazio PermGen.
Esempio:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
Una parola sulla raccolta dei rifiuti:
Non fare affidamento finalize()
perché non è garantito che funzioni. Spetta totalmente alla JVM decidere quando eseguire il garbage collector e cosa raccogliere, anche se un oggetto è idoneo per la garbage collection.
Ovviamente puoi impostare una variabile statica su null e quindi rimuovere il riferimento all'oggetto sull'heap, ma ciò non significa che il garbage collector lo raccoglierà (anche se non ci sono più riferimenti).
Inoltre finalize()
viene eseguito solo una volta, quindi devi assicurarti che non generi eccezioni o altrimenti impedire la raccolta dell'oggetto. Se interrompi la finalizzazione a causa di qualche eccezione, finalize()
non verrà richiamato sullo stesso oggetto una seconda volta.
Una nota finale : il modo in cui il codice, i dati di runtime ecc. Vengono memorizzati dipende dalla JVM che viene utilizzata, ad esempio HotSpot potrebbe farlo in modo diverso da JRockit e questo potrebbe anche differire tra le versioni della stessa JVM. Quanto sopra è basato su HotSpot per Java 5 e 6 (quelli sono fondamentalmente gli stessi) poiché al momento della risposta direi che la maggior parte delle persone ha utilizzato quelle JVM. A causa di importanti cambiamenti nel modello di memoria a partire da Java 8, le dichiarazioni sopra potrebbero non essere vere per Java 8 HotSpot - e non ho controllato le modifiche di Java 7 HotSpot, quindi immagino che quanto sopra sia ancora vero per quella versione, ma non sono sicuro qui.