Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2016, 17:16   #1
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию Сборщик мусора не удаляет локальную переменную

Вообще вопрос из JavaFX, но так как нет такого раздела, то прошу модераторов не удалять эту тему.

При старте программы выводится сообщение, о том что бы user подождал пока прога проверит наличие обнов. Вывод сообщения производится в отдельном методе (соответственно, по логике, сборщик мусора должен был убрать все то, что было создано в этом методе)... Но профайлер показывает, что объекты завязанные на Label с того метода по прежнему существуют (объекты из 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();
        
        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();
        message.add(new javax.swing.JLabel("<html><H1>Идет проверка наличия обновлений...</html>"));
        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();
    }
}
Скрин 1 с профайлера

Скрин 2 с профайлера
BleStaR вне форума Ответить с цитированием
Старый 31.03.2016, 20:52   #2
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Не проверял, но это первое что приходит на ум:
Код:
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();
        message.add(new javax.swing.JLabel("<html><H1>Идет проверка наличия обновлений...</html>"));
        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();
        message = null;
    }
}
Одному Бугу известно когда JVM чистит память...

П.С. Что вынудило пойти на такие извращения с перемешиванием awt, swing и javafx ?
Skype: CODERua
[CODER] вне форума Ответить с цитированием
Старый 01.04.2016, 03:58   #3
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Предложенный вариант я проверял (он не помогает, ровно как и Label = null и message.removeAll() - так же с вызовом gc после метода)

По поводу извращения: конкретных причин особо нет, можно переделать (просто когда то давно было сделано так, так оно и осталось)... Но суть не в том, что это извращение, а в том что данные классы не выгружаются.

С одной стороны по коду все норм (переменные локальные и должны быть уничтожены), с другой стороны профайлер говорит что Stage держит где то ссылку на мой "метод"/label и вот как это ссылку найти и занулить, что бы сделать все эти данные недостижими (может быть есть сторонние профайлеры, более мощные или что нибудь в этом духе)?
BleStaR вне форума Ответить с цитированием
Старый 04.04.2016, 04:22   #4
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Люди, человеки, программисты... Все еще нужна помощь
BleStaR вне форума Ответить с цитированием
Старый 05.04.2016, 14:33   #5
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Код:
	private void showMsgCheckUpdate() throws IOException {
		Stage stage = new Stage();
		stage.initStyle(StageStyle.UNIFIED);
		GridPane grid = new GridPane();
		grid.setAlignment(Pos.CENTER);
		grid.setPadding(new Insets(25, 25, 25, 25));
		Text message = new Text("Идет проверка наличия обновлений...");
		message.setFont(new Font(18));
		grid.getChildren().add(message);
		Scene scene = new Scene(grid);
		stage.setScene(scene);
		stage.setOpacity(0.9);
		stage.show();
                // Тут проверка обновления
		stage.close();
	}
Skype: CODERua
[CODER] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сборщик мусора не удаляет объект constant_ural C# (си шарп) 4 29.09.2015 17:31
сборщик мусора goluzov Общие вопросы C/C++ 2 29.04.2012 15:25
Сборщик мусора в динамическом списке Homutova_Julia Помощь студентам 4 17.06.2011 19:09
Не могу организовать сборщик мусора Homutova_Julia Помощь студентам 5 08.06.2011 13:22
Опрос: Сборщик мусора Пепел Феникса Общие вопросы по программированию, компьютерный форум 15 20.04.2011 19:19