2010-03-15 5 views

Antwort

10

die Beantwortung der Frage (n) in der comment gestellt.

Sobald Sie ein Dialog angezeigt haben:

setVisible(true); 

Sie es ausblenden, indem Sie anrufen:

setVisible(false); 

und dann müssen Sie rufen:

dialog.dispose(); 

sicher zu stellen, dass alle nativen GUI-Ressourcen Der verwendete Dialog wird freigegeben. Sobald Sie dies getan haben, bereinigt der Garbage Collector alle Objekte, sobald Sie keine Referenzen mehr auf sie haben.

+0

und was, wenn es kein Dialog ist.Es kann einfache Klasse sein? Dann, was Sie vorschlagen werden – Sameer

+0

Wenn es eine einfache Klasse ist, dann wird es durch den Garbage Collector "zerstört", sobald Sie keine Verweise darauf mehr haben. –

+0

Ich denke, das sollte auch mit der Dialogklasse passieren. – Sameer

4

Keine Notwendigkeit, das Objekt zu löschen. Der Speicherbereiniger kümmert sich um den Speicher, sobald er nicht mehr referenziert wird.

+0

aber ich erstelle einen Dialog mit jpanel drin, und dieser jpanel wird immer noch referenziert. Ich möchte diesen Dialog löschen, wenn ich auf meine eigene Schaltfläche "Cancel" klicke – joseph

+0

So können Sie es auf null setzen – RubyDubee

+0

@joseph: Entfernen Sie das 'JPanel' aus dem Dialog, wenn Sie es schließen, wenn Sie weiterhin einen Verweis auf den 'JPanel'. Dies verhindert, dass der JPanel einen Verweis auf den Dialog behält und ihn (den Dialog) beibehält. –

2

Du meintest "wie" es zu zerstören? Es gibt keine Möglichkeit, ein Objekt explizit in Java zu zerstören. Garbage Collector in Java reklamiert automatisch den von ihm belegten Speicher Wenn keine Referenz existiert, existiert derselbe.

„aber ich erstelle Dialog mit JPanel im Innern, und das JPanel wird noch referrenced sein. Ich will zerstören, dass Dialog, wenn meine eigene Taste auf "Abbrechen"

Versuch mal Einstellung, die JPanel-Objekt die Methode dispose auf, es zu null oder rufen Sie, wenn diese verfügbar ist

2

Wenn Sie den Objektverweis auf null löschen möchten, kann Gobage Collector beim nächsten Ausführen das Objekt zerstören, weil er denkt, dass es nicht referenziert wird.

3

Sie können die finalize() - Methode überschreiben (siehe http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize%28%29), um die Bereinigung durchzuführen, wenn ein Objekt zerstört wird.

Im Gegensatz zu C++ gibt es jedoch keine Garantie, wann diese Methode aufgerufen wird. In C++ haben Sie Stapelspeicherobjekte, die zerstört werden, wenn die Ausführung den Bereich verlässt, in dem sie definiert wurden.

In Java werden alle Objekte auf dem Heap gespeichert. Sie werden abgeschlossen, wenn der Müllsammler beschließt, sie zu sammeln (impliziert, dass sie nicht von Ihrer App aus erreichbar sind), aber Sie wissen nicht, wann der GC eintreten wird. Wenn Sie also eine Säuberung haben, die zu einem bestimmten stattfinden muss (zB eine Datei schließen, damit sie geschrieben werden kann), müssen Sie sie selbst codieren und sich nicht darauf verlassen, dass die finalize() -Methode aufgerufen wird.

Das typische Muster für die auf einem try ... finally Block basiert tun:

X x = null; 
try { 
    // ... do some stuff 
    x = ... // obtain an object 
    ... // do some stuff 
} 
finally { 
    if(x != null) 
    x.close(); // Perform cleanup WRT x 
} 

(Zugegeben, hässlich)

2

Es besteht keine Notwendigkeit zu Objekt in Java in der Art und Weise wie in C zu zerstören ++.Es gibt einen Garbage Collector, der Objekte automatisch löscht (Speicher freigeben), nachdem im laufenden Code keine Referenzen auf dieses Objekt vorhanden sind. Alles, was Sie tun können, ist die Zerstörung der Verbindung durch Object obj = null; Dies tötet Bezug auf Obj.

5
  1. Wenn es ein Fenster ist, und wenn es sichtbar ist

    I. frame.setVisible (false);

    II. frame.dispose();

    II. Satz Bezugnahme auf null (ex .. frame = null;)

  2. Wenn es nicht ein Fenster

    i.soll Bezugnahme auf null (ex .. x = null;)

Das ist alles, sobald das Objekt frei ist, wird GC die Ressourcen freigeben, wenn es wie ist.

Hier sind Somethings Sie

* verstehen müssen. Sie als Java-Programmierer können Garbage Collection in Java nicht erzwingen; Es wird nur ausgelöst, wenn JVM denkt, dass es eine Speicherbereinigung basierend auf Java-Heap-Größe benötigt.

*. Es gibt Methoden wie System.gc() und Runtime.gc() die verwendet wird, um Anfrage von Garbage Collection zu JVM senden, aber es ist nicht garantiert, dass Garbage Collection passieren wird.

*. Wenn es für die Schaffung neues Objekts in Heap Java Virtual Machine Würfe OutOfMemoryError oder java.lang.OutOfMemoryError Heap-Speicher

Und sucht darüber kein Speicherplatz ist ...

J2SE 5 (Java 2 Standard Edition) fügt eine neues Feature namens Ergonomie. Ziel der Ergonomie ist es, eine gute Leistung der JVM mit einem Minimum an Befehlszeilen-Tuning zu erreichen.

1

"System.gc()" ist der beste Weg.

gc-Müllsammler.

Dies ist, wie Sie gonna das Objekt im Programm selbst

zerstören

Beispielcode:

public class TestRun 
{ 
    public static void main(String args[]) 
    { 
    /*1*/  TestRun tr=new TestRun(); 
    /*2*/  System.gc(); //You can omit this step. This is just an example. 
    /*3*/  tr=null;  
    /*4*/  System.gc(); 
    }  
} 

Erklärung

  1. ein Objekt der Klasse TestRun erstellt und als Referenz in der Variablen 'tr' gespeichert.

  2. Garbage Collector heißt. Aber macht keinen Effekt. Weil noch kein Objekt dereferenziert ist.

  3. Das Objekt, das in Schritt 1 erstellt wurde, wird jetzt dereferenziert.Aber der Raum, der von dem Objekt eingenommen wurde, ist immer noch von ihm blockiert.

  4. Garbage Collector wird erneut aufgerufen und erkennt jetzt, dass das Objekt, das in Schritt 1 erstellt wurde, jetzt dereferenziert wird. Daher wird jetzt der vom Objekt belegte Platz frei und das Objekt wird nun in einfacher Sprache aus dem Speicher gelöscht.

In der Tat wird es alle jene Objekte löschen, die bereits dereferenziert sind.

Es ist eine gute Übung, es in Ihrem Code zu nennen.

Verwandte Themen