2016-04-01 17 views
0

Programım başlatıldığında güncellemeleri beklemenin bir yolu var. Bu mesaj ayrı bir yöntemle gösterilmiştir. Yani, bu yöntem içindeki her şey Çöp Toplayıcı tarafından kaldırılmalıdır. Ancak Profiler (NetBeans 8.1 kullanıyorum), bir Etikete ayrı bir yöntemle bağlı olan tüm nesnelerin hala var olduğunu gösteriyor (javax.swing nesneleri). Bir memenin (RAM) temizlenmesi için Etikete ve Etikete bağlı tüm nesneleri nasıl silebilirim? örneğinÇöp Toplama yerel değişkeni kaldırmadı

Bu gereksiz amaçları,: javax.swing.text.GapContent, javax.swing.text.html.parser.Parser ve vardır

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

javax.swing paketinden tüm diğer nesneler Profiler'in ekran görüntüsü: http://fastpic.ru/view/73/2016/0401/0aa1bc957c73dd026ce5add133f1da5c.png.html

javafx'i kullandığımızda bir Stage ile aynı duruma sahibiz. http://fastpic.ru/view/76/2016/0401/80a3297ac660458a0feb327f74e18b01.png.html

cevap

0

Çöp toplama tahmin etmek kolay değildir ve bazı nesne veya kaldırılmayacak olacağı gerçeğine röle olmaz:

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

bir Profiler'ın ekran görüntüsü yoktur.

Neden bu nesneyi yığından kaldırılmaya zorlamak istersiniz?

+0

Hafızamı temizlemem gerekiyor, bu uygulamayı coz coz çok tüketiyor ve bunlar da sorunlardan biri - silindikten sonra canlı nesneler. – Tereshka

+0

@Tereshka Çöp toplayıcısını bu nesneleri çıkarmak için zorlamak için bir yol yoktur. Genç veya yaşlı nesilde yeterince bellek olmadığı zaman onları kaldıracaktır (ve nesnenin kullanılmadığı, böylece sizin durumunuzda olduğu gibi). Tam GC'nin küçüğünden sonra nesnelerin listesini görmeyi denediniz mi? –

+0

@Tereshka Ayrıca System.gc() işlevinin çağrılması da anlamsız, java gerektiğinde değil, gerektiğinde GC'yi arayacak. –