Почему GC не очищает ссылки Dialog? - PullRequest
0 голосов
/ 01 апреля 2010

У меня есть диалог. Каждый раз, когда я его создаю, а затем удаляю, он остается в памяти.

Кажется, где-то утечка памяти, но я не могу понять. Есть ли у вас какие-либо идеи? Для получения дополнительной информации см. Скриншот дампа кучи.

Заранее спасибо.

http://img441.imageshack.us/img441/5764/leak.png

Ответы [ 6 ]

2 голосов
/ 01 апреля 2010

Если я правильно понимаю ваш скриншот, все ссылки слабые, поэтому в конечном итоге он получит GCd. Но нет никаких гарантий относительно , когда это будет GCd; как правило, это не произойдет сразу. Вы можете попытаться поторопить сборщик мусора, запустив сборщик мусора (System.gc()), но все еще нет никаких гарантий, будет ли он собирать весь мусор или нет.

0 голосов
/ 01 апреля 2010

Остальные правы, что System.gc() является предложением. В качестве альтернативы вы можете проверить кучу вашей программы с помощью инструмента, реализующего метод интерфейса инструмента JVM ForceGarbageCollection, такого как профилировщик NetBeans.

0 голосов
/ 01 апреля 2010

Вы уверены, что GC действительно запущен? Запустите ваше приложение с java -verbose:gc etc, и виртуальная машина будет выводить отчет о состоянии на консоль каждый раз, когда выполняется GC. Подробнее о настройке сборки мусора для Java 6 .

0 голосов
/ 01 апреля 2010

В зависимости от того, в каком поколении кучи находится ваш объект, он будет или не будет собираться мусором второстепенным сборщиком мусора. Чтобы быть уверенным в том, что все объекты с ненадежными ссылками являются GCed, вам нужно запустить полный GC, и способ добиться этого - вызвать OutOfMemoryError ... Вы можете сделать это с помощью следующего кода:

try {
        List<byte[]> list = new ArrayList<byte[]>();
        while (true) {
            list.add(new byte[1024]);
        }
    } catch (OutOfMemoryError oome) {
        // full GC should have run here...
    }
0 голосов
/ 01 апреля 2010

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

0 голосов
/ 01 апреля 2010

Вы уверены, что располагаете своим диалогом? Стандарт JDialog является HIDE_ON_CLOSE. Изменение defaultCloseOperation на DISPOSE_ON_CLOSE может помочь, если вы этого еще не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...