2012-04-06 16 views
1

Ich habe ein folgenden Code:Java Garbage Collection und null

List<String> list = new ArrayList<String>(); 
    // WeakReference<List> wr = new WeakReference<List>(list); 
    System.out.println(" before tot memory... " + Runtime.getRuntime().totalMemory()); 
    System.out.println(" before free memory... " + Runtime.getRuntime().freeMemory()); 
    for(int i =0; i<100; i++) 
    list.add(new String("hello")); 
    //System.gc(); 
    list = null; //forcefully end its life expectancy 
    System.out.println(" after tot memory... " + Runtime.getRuntime().totalMemory()); 
    System.out.println(" after free memory... " + Runtime.getRuntime().freeMemory()); 
    System.out.println(" after memory used ... " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); 
    // System.out.println(" weak reference " + wr.get()); 

Wenn ich den obigen Code ausführen, kann ich den freien Speicher sehen ist 361.064 (In meinem System, aber dieser Wert kann variieren)

Aber wenn ich den obigen Code mit System.gc() und Kommentar list = null, kann ich sehen, meine freie Speicher kommt (160944 in diesem Fall) weniger als die oben genannten Testfall. In beiden Szenarien werden die Objekte aus dem Speicher entfernt. Warum unterscheiden sich diese Werte?

+1

'new String (" hallo ")' erstellt zwei Objekte. Dieser Konstruktor sollte niemals verwendet werden. Versuchen Sie 'list.add (" Hallo ")' –

+0

@ajozwik Ich würde nicht sagen "nie". Es gibt gültige Anwendungsfälle dafür. Deshalb existiert es. – EJP

Antwort

1

list = null; Wenn Sie eine Referenz aufheben, wird automatisch eine Müllsammlung durchgeführt. Wenn Sie diese Zeile kommentieren, ist die Referenz Liste immer noch aktiv, selbst wenn Sie System.gc() aufrufen, wird es nicht Müll gesammelt werden.

Wenn Sie gc() explizit aufrufen, sind die Verweise, die bereits ungültig gemacht wurden oder die außerhalb des Gültigkeitsbereichs liegen, nur Müll gesammelt.

+0

Wenn das der Fall ist, was ist System.gc(). In welchen Szenarien kann es wirklich verwendet werden :) Wenn list = null kommentiert und die Anwendung ausgeführt wird, was macht System.gc(), weil es etwas freigibt oder freigibt – UVM

+0

@UNNI gc() wird alle diese Referenzen freigeben sind ungültig oder außerhalb des Geltungsbereichs. Es wird niemals diese Referenzen löschen, die aktiv sind. –

+0

im obigen Testfall, wenn Sie nur mit System.gc() ausführen, gibt es etwas Speicher oder einige "Wert". In diesem Fall, was ist dieser Wert freigegeben, weil die Liste noch aktiv ist, wird es nicht gced. – UVM

0

GC arbeitet mit Blick auf alle Objekte im Speicher, um objects which are no longer being referenced im Programm zu finden. Diese unbenutzten Objekte können gelöscht werden, um Platz für neue Speicherobjekte zu schaffen.

Also, wenn ein Objekt immer noch verwiesen wird kann nicht Müll gesammelt werden, auch wenn Sie System.gc() aufrufen. Wie kann ein Objekt Müll gesammelt werden, wenn Sie es in Ihrem Code verweisen können?

Durch Aufruf list = null das Objekt, das von list Variable verwiesen wurde, kann nicht erneut verwiesen werden, so dass es berechtigt ist, Müll zu sammeln.