2012-10-29 3 views
7

Sto creando un programma dimostrativo di esempio per farmi capire che come posso deallocare il riferimento di variabili statiche, metodi in java usando Garbage Collector?Il garbage collector funziona su variabili o metodi statici in java?

Sto utilizzando Riferimento debole per non impedire il garbage collector.

Classe Sample

public class Sample { 

    private static String userName; 
    private static String password; 
    static { 
     userName = "GAURAV"; 
     password = "password"; 
    } 
    public static String getUserName(){ 
     return userName; 
    } 
    public static String getPassword(){ 
     return password; 
    } 
} 

Classe User

import java.lang.ref.WeakReference; 

public class User { 

    public static void main(String[] args) { 
     /** 
     * Created one object of Sample class 
     */ 
     Sample obj1 = new Sample(); 
     /** 
     * I can also access the value of userName through it's class name 
     */ 
     System.out.println(obj1.getUserName()); //GAURAV 
     WeakReference<Sample> wr = new WeakReference<Sample>(obj1); 
     System.out.println(wr.get()); //[email protected] 
     obj1 = null; 
     System.gc(); 
     System.out.println(wr.get()); // null 
     /** 
     * I have deallocate the Sample object . No more object referencing the Sample oblect class but I am getting the value of static variable. 
     */ 
     System.out.println(Sample.getUserName()); // GAURAV 
    } 

} 
+0

Il garbage collector raccoglie oggetti, non variabili. Una variabile è un contenitore che/contiene/un riferimento. E, soprattutto, nella maggior parte dei casi non si vuole rovinare la garbage collection. – ignis

+0

Troppe statistiche. Perché li stai mescolando? –

+0

No, dovrai pulirti dopo te stesso – Nactus

risposta

16

campi statici sono associati con la classe, non un'istanza individuale.

I campi statici vengono eliminati quando il ClassLoader che mantiene la classe scaricata. In molti programmi semplici, questo non è mai.

Se si desidera che i campi siano associati a un'istanza e puliti, l'istanza viene ripulita, rendendoli campi di istanza, non statici.

+0

Inoltre, non sono letterali a stringa mai GC, perché sono mantenuti nel lotto letterale String? O è anche su base per-classloader? –

+1

I valori letterali stringa AFAIK vengono eliminati. Se internisti() un sacco di stringhe casuali e le scarti non otterrai un OOME. Dove le stringhe internate rappresentano un problema è che fino a Java 6 erano nel PermGen ed era possibile ottenere un OOME che riempiva questo spazio quando si aveva un sacco di heap. In Java 7 i valori letterali delle stringhe si trovano nell'heap. –

+0

Grazie per tutte le vostre risposte. –

4

System.gc() non impone garbage collector per funzionare. È solo un suggerimento per JVM che probabilmente è un buon momento per eseguire Garbage Collector. Vedere questa domanda - When does System.gc() do anything

3

È necessario comprendere che System.gc(); non chiama Garbage Collector. Chiede gentilmente a GC di rimuovere alcuni rifiuti. GC decide cosa fare e quando iniziare da solo. Quindi, non aspettarti che vedrai alcun effetto immediato quando chiami System.gc();, assegnando null alla variabile ecc.

GC rimuove tutti gli oggetti a cui non è possibile accedere in alcun modo. Quindi, se il codice terminava il blocco in cui era definita la variabile, l'oggetto può essere rimosso. Assiging null rimuove il riferimento. Un riferimento debole non impedisce a GC di rimuovere l'oggetto.

Spero che questa spiegazione aiuti.

4

Altro che il programma, per rispondere alla tua domanda

  1. No. metodi non sono garbage collection perché non esistono nel mucchio, in primo luogo.

  2. variabili statiche appartengono l'istanza classe e non saranno garbage collection volta caricati (per la maggior parte dei Classloader generali)