2012-10-29 4 views
7

Ich erstelle ein Beispiel-Demo-Programm für mich zu verstehen, dass, wie kann ich die Referenz von statischen Variablen, Methoden in Java mit Garbage Collector freizugeben?Arbeitet der Garbage Collector in Java mit statischen Variablen oder Methoden?

Ich verwende schwache Referenz, um den Garbage Collector nicht zu verhindern.

Klasse 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; 
    } 
} 

Klasse 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

Der Garbage Collector sammelt Objekte, keine Variablen. Eine Variable ist ein Container, der/eine Referenz enthält. Und am wichtigsten ist, dass Sie sich in den meisten Fällen nicht mit der Garbage Collection herumschlagen wollen. – ignis

+0

Zu viele Statiken. Warum mischst du sie? –

+0

Nein, müssen Sie nach sich selbst reinigen – Nactus

Antwort

16

statische Felder sind mit der Klasse verbunden sind, nicht eine einzelne Instanz.

statische Felder werden bereinigt, wenn der ClassLoader die Klasse entladen hat. In vielen einfachen Programmen ist das nie so.

Wenn die Felder mit Instanzen verknüpft und aufgeräumt werden sollen, dann wird die Instanz bereinigt, um Instanzfelder zu erstellen, nicht statische Felder.

+0

Auch werden String-Literale nie GC'd trotzdem, weil sie im String-Literal-Pool gehalten werden? Oder ist das auch auf einer Pro-Classloader-Basis? –

+1

AFAIK String-Literale werden bereinigt. Wenn Sie viele zufällige Strings internieren() und sie verwerfen, erhalten Sie kein OOME. Wo internierte Strings ein Problem sind, ist das bis zu Java 6 in dem PermGen und es war möglich, einen OOME zu erhalten, der diesen Space füllt, wenn Sie genügend Heap hatten. In Java befinden sich 7 String-Literale im Heap. –

+0

Danke für alle deine Antworten. –

4

System.gc() läuft nicht Garbage Collector zwingen. Es ist nur ein Vorschlag an JVM, dass es wahrscheinlich eine gute Zeit ist, den Garbage Collector auszuführen. Siehe diese Frage - When does System.gc() do anything

3

Sie sollten verstehen, dass System.gc(); Garbage Collector nicht aufrufen. Es bittet GC nur höflich, etwas Müll zu entfernen. GC entscheidet, was zu tun ist und wann er beginnt. Erwarten Sie daher nicht, dass Sie sofort einen Effekt sehen, wenn Sie System.gc(); aufrufen, null der Variablen usw. zuweisen.

GC entfernt alle Objekte, auf die nicht zugegriffen werden kann. Wenn also der Code-Block verlassen wurde, wo die Variable definiert wurde, kann das Objekt entfernt werden. Durch die Zuweisung von Null wird die Referenz entfernt. Eine schwache Referenz verhindert nicht, dass GC das Objekt entfernt.

Ich hoffe, diese Erklärung hilft.

4

Anders als das Programm, Ihre Frage

  1. Nr zu beantworten Methoden sind nicht Müll gesammelt, weil sie nicht in erster Linie in dem Heap vorhanden ist.

  2. Statische Variablen gehören zu der Klasse-Instanz und nicht Müll einmal geladen gesammelt werden (für die meisten der allgemeinen Classloader)

Verwandte Themen