2016-04-01 9 views
0

Es gibt eine Meldung über das Warten auf Updates, wenn mein Programm gestartet wird. Diese Nachricht wird in einer separaten Methode angezeigt. Also sollte alles innerhalb dieser Methode von Garbage Collector entfernt werden. Aber Profiler (ich benutze NetBeans 8.1) zeigt mir, dass alle Objekte, die mit einem Label aus einer separaten Methode verbunden sind, noch existieren (javax.swing Objekte). Wie kann ich alle Objekte entfernen, die mit dem Label und dem Label selbst verbunden sind, um ein Memory (RAM) zu löschen?Garbage Collection entfernt lokale Variable nicht

Diese unnötigen Objekte, zum Beispiel: javax.swing.text.GapContent, javax.swing.text.html.parser.Parser und alle anderen Objekte aus dem Paket javax.swing

package example; 

import java.io.IOException; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Example extends Application { 
    public static void main(String[] args) { 
    launch(args); 
} 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     showMsgCheckUpdate(); 
     System.gc(); 
     StackPane root = new StackPane(); 
     root.getChildren().add(new Button("Say 'Hello World'")); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void showMsgCheckUpdate() throws IOException { 
     java.awt.Dimension size = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
     javax.swing.JWindow message = new javax.swing.JWindow(); 
     javax.swing.JLabel l = new javax.swing.JLabel("<html><H1>Идет проверка наличия обновлений...</html>"); 
     message.add(l); 
     message.setOpacity(0.9f); 
     message.pack(); 
     message.setBounds(size.width/2 - message.getWidth()/2, size.height/2 - message.getHeight()/2, message.getWidth(), message.getHeight()); 
     message.setVisible(true); 
     // Тут проверка обновления 
     message.setVisible(false); 
     message.dispose(); 
    } 
} 

a Es ist Profilers Screenshot: http://fastpic.ru/view/73/2016/0401/0aa1bc957c73dd026ce5add133f1da5c.png.html

Wir haben die gleiche Situation mit einer Bühne, wenn wir javafx verwenden.

private void showMsgCheckUpdate() throws IOException { 
    Label l = new Label("Идет проверка наличия обновлений..."); 

    Stage stage = new Stage(); 
    Scene scene = new Scene(l); 
    scene.getStylesheets().add(""); 

    stage.setScene(scene); 
    stage.show(); 
    // Тут проверка обновления 
    stage.close(); 
} 

gibt es einen Screenshot der Profiler: http://fastpic.ru/view/76/2016/0401/80a3297ac660458a0feb327f74e18b01.png.html

Antwort

0

Garbage Collection nicht leicht vorherzusagen ist, und ich würde nicht darauf Relais, dass einige Objekt wird oder nicht entfernt werden.

Warum möchten Sie diese Objekte vom Heap entfernen?

+0

Ich muss mein Gedächtnis reinigen, denn diese App isst zu viel, und dies ist eines der Probleme - lebende Objekte nach dem Löschen. – Tereshka

+0

@Tereshka Es gibt keine Möglichkeit, den Garbage Collector zum Entfernen dieser Objekte zu zwingen. Es wird sie entfernen, wenn in der jungen oder alten Generation nicht genug Speicher vorhanden ist (und das Objekt nicht benutzt wird, also genauso wie in Ihrem Fall). Haben Sie versucht, die Liste der Objekte nach dem Minor des vollständigen GC zu sehen? –

+0

@Tereshka Auch den Aufruf von System.gc() ist sinnlos, Java wird GC aufrufen, wenn es nötig ist, nicht wenn wir es erzwingen. –