垃圾收集不会删除局部变量

时间:2016-04-01 08:05:26

标签: javafx garbage-collection ram

当我的程序启动时,有一个关于等待更新的消息。该信息以单独的方法显示。因此,垃圾收集器应该删除此方法中的所有内容。但是Profiler(我使用NetBeans 8.1)告诉我,所有与Label相连的对象仍然存在(javax.swing对象)。如何删除与Label和Label本身连接​​的所有对象以清理内存(RAM)?

这些不必要的对象,例如: javax.swing.text.GapContent,javax.swing.text.html.parser.Parser和包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();  
    }  
}

有一个Profiler的屏幕截图:http://fastpic.ru/view/73/2016/0401/0aa1bc957c73dd026ce5add133f1da5c.png.html

当我们使用javafx时,我们对舞台的情况相同。

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();  
}

有一个Profiler的屏幕截图:http://fastpic.ru/view/76/2016/0401/80a3297ac660458a0feb327f74e18b01.png.html

1 个答案:

答案 0 :(得分:0)

垃圾收集不容易预测,我不会转发某些对象将被删除的事实。

为什么要强制将这些对象从堆中删除?