Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с анализом дампа кучи / 18 сообщений из 18, страница 1 из 1
18.07.2014, 10:32
    #38700033
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Доброго вам дня, уважаемые гуру)

Занялся поиском утечек памяти в приложении. Так вот, после отработки сборщика мусора остаются в живых некоторые объекты. Не могу понять почему. Для примера интересует GUI.personal.RulePass_gui

ссылка на дамп: https://www.dropbox.com/sh/qublrunvqovdbme/AACF3kZTHg56GTSXn-NYYEB_a

Заранее благодарю за помощь
...
Рейтинг: 0 / 0
18.07.2014, 10:45
    #38700056
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
...
Рейтинг: 0 / 0
18.07.2014, 10:47
    #38700061
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Имя потока - safe_ref
...
Рейтинг: 0 / 0
18.07.2014, 10:54
    #38700074
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Blazkowicz,

спасибо, что откликнулись. Я видел, что ссылка идет туда. Но, в том потоке, на мой взгляд, нет ничего криминального. Поток работает в фоне, а в момент когда я снимал дамп, поток был в ожидании, да в принципе, после запуска приложения поток дальше Class take = tasks.take(); не заходил, т.к. чтобы в tasks попал объект, нужно было выполнить действия, которые не выполнял.
Не понимаю, почему этот поток держит объекты :(

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
        save_ref=new Thread(new Runnable() {

            @Override
            public void run() {
                while (true && !Thread.currentThread().isInterrupted()) {
                    try {
                        Class take = tasks.take();
                        

                        for (Field field : fields) {
                            try {
                                Object get = field.get(null);
                                if (get instanceof Reference) {
                                    Reference ref = (Reference) get;
                                    if (ref.getClazz().equals(take)) {
                                        ((Reference) get).saveReference();
                                        break;
                                    }
                                }
                            } catch (IllegalArgumentException | IllegalAccessException ex) {
                                Logger.getLogger(ReferencesController.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    } catch (InterruptedException ex) {
                        Thread.currentThread().interrupt();
                    }
                }
            }
        });
...
Рейтинг: 0 / 0
18.07.2014, 11:01
    #38700089
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
закомментировал запуск потока. в итоге картина такова:
...
Рейтинг: 0 / 0
18.07.2014, 11:12
    #38700106
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Ваш класс References имеет статическое поле REFERENCES_PERSONAL, которое и ссылается на GUI.personal.RulePass_gui.
Что именно не понятно?
...
Рейтинг: 0 / 0
18.07.2014, 11:13
    #38700111
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Blazkowicz, спасибо! Уже все понял, исправляю)
...
Рейтинг: 0 / 0
18.07.2014, 11:35
    #38700135
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Blazkowicz, еще один вопрос.
Подскажите пожалуйста, как грамотно сделать unbind при закрытии формы для такого кода:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        list.setCellFactory(new Callback<ListView<T>, ListCell<T>>() {
            @Override
            public ListCell<T> call(ListView<T> arg0) {
                final Label leadLbl = new Label();
                final Tooltip tooltip = new Tooltip();
                ListCell<T> cell = new ListCell<T>() {
                    @Override
                    public void updateItem(T item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item != null) {
                            textProperty().bind(item.nameProperty());
                            leadLbl.textProperty().bind(item.nameProperty());
                            tooltip.textProperty().bind(item.nameProperty());
                            setTooltip(tooltip);
                        }
                    }
                };
                return cell;
            }

        });
...
Рейтинг: 0 / 0
18.07.2014, 12:00
    #38700173
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
danatriel,

Разве не так?
Код: java
1.
2.
3.
                            textProperty().unbind();
                            leadLbl.textProperty().unbind();
                            tooltip.textProperty().unbind();
...
Рейтинг: 0 / 0
18.07.2014, 12:17
    #38700198
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Blazkowicz, danatriel

как вы такие красивые картинки дампа делаете?
...
Рейтинг: 0 / 0
18.07.2014, 12:19
    #38700200
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
redwhite90как вы такие красивые картинки дампа делаете?
JDK/bin/jvisualvm
...
Рейтинг: 0 / 0
18.07.2014, 12:33
    #38700218
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Blazkowicz, да, именно так, но вопрос был в какой момент нужно анбиндить. Уже разобрался
                        if (item != null) {
                            textProperty().bind(item.nameProperty());
                            leadLbl.textProperty().bind(item.nameProperty());
                            tooltip.textProperty().bind(item.nameProperty());
                            setTooltip(tooltip);
                        }else{
                            textProperty().unbind();
                            leadLbl.textProperty().unbind();
                            tooltip.textProperty().unbind();
                        }
...
Рейтинг: 0 / 0
18.07.2014, 12:34
    #38700219
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
redwhite90,ну или в netbeans есть свое средство профилирования (то же самое, что и visualvm), но можно переходить к исходникам прям оттуда
...
Рейтинг: 0 / 0
18.07.2014, 17:28
    #38700643
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
danatrielBlazkowicz, еще один вопрос.
Подскажите пожалуйста, как грамотно сделать unbind при закрытии формы для такого кода:
По моему скромному мнению, самое грамотное решение - использовать WeakReference для слушателей,
тогда никакого "unbind" делать не надо.

Но не знаю, как с этим обстоят дела в JavaFX.
...
Рейтинг: 0 / 0
18.07.2014, 17:53
    #38700677
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Хотя, не важно как с этим в JavaFX, weak ссылки нужно хранить в модели и все будет хорошо :-)
...
Рейтинг: 0 / 0
18.07.2014, 22:47
    #38700856
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
HoBTIDПо моему скромному мнению, самое грамотное решение - использовать WeakReference для слушателей,
тогда никакого "unbind" делать не надо.

Так это. А где-то надо ссылку на слушателя хранить, чтобы он не собрался когда не надо.
...
Рейтинг: 0 / 0
19.07.2014, 09:58
    #38700944
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
BlazkowiczТак это. А где-то надо ссылку на слушателя хранить, чтобы он не собрался когда не надо.
Да, ссылку хранит тот, кто вешает слушателя: контроллер, в случае MVC, модель представления, в случае MVVM,
или само представление, если не использовать паттерны.
...
Рейтинг: 0 / 0
19.07.2014, 10:05
    #38700945
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с анализом дампа кучи
Например, если в случае MVC сслыка на контроллер у нас хранится только в форме,
то при ее закрытии контроллер становится unreachable,
т.к. только он содержит обычные ссылки на слушателей, они становятся weakly reachable и собираются сборщиком мусора.

Про отвязку модели от формы беспокоиться не надо, все произойдет автоматически.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с анализом дампа кучи / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]