Вызывает ли утечка памяти JFrame? - PullRequest
8 голосов
/ 11 сентября 2011

Я пишу тестовую программу следующим образом:

  1. Когда пользователь нажимает кнопку A, он открывает 50 кадров JFrames.
  2. Когда пользователь нажимает кнопку B, он удаляет все JFrames, показанные нажатием кнопки A.

Я считаю, что память не уменьшается после нажатия кнопки B. Я определил это с помощью диспетчера задач, ctrl + alt + del в Windows, и проверка использования памяти "Java".

Ответы [ 3 ]

11 голосов
/ 11 сентября 2011

Это верно, ни в коем случае, не в состоянии решить, что (не только в Java PL),

1) действительно не создает много Контейнеров верхнего уровня во время выполнения /Fly, потому что они никогда не завершаются, и до тех пор, пока текущий экземпляр JVM не выйдет, и эти Объекты никогда не были GC'ы, только их Grapfics2D

2) myContainer#dispose() во время выполнения для текущего экземпляра JVM такие же, как и myContainer#setVisible(false) в соединениях с доступной и используемой JVM памятью

3) создайте только несколько Top-Level Containers (максимум отображается одновременно), используйте это повторно, но оставьте там JPanel как 1.st JComponent и позвоните myPanel#removeAll(), в противном случае вы удалите RootPane и из вашего Контейнера останутся только границы :-) будет прозрачным

4) возможно частичное уменьшение используемой памяти JVM по вызовуGC, но только количество возвратов от Graphics2D и Garbage не работает сразу,

5) больше здесь полезная информация здесь

2 голосов
/ 11 сентября 2011

Без кода мы ничем не можем вам помочь ... вы звоните в jFrame. dispose () ?

public void dispose ()

Освобождает все ресурсы собственного экрана, используемые этим окном, его подкомпоненты и все принадлежащие ему дочерние элементы.То есть ресурсы для этих Компонентов будут уничтожены, любая потребляемая ими память будет возвращена ОС, и они будут помечены как неотображаемые.

Дополнительная информация доступна здесь

0 голосов
/ 21 июля 2016

Если в вашем фрейме имеется сильная ссылка на корень GC (сборщик мусора), то если вы вызвали метод dispose, он не будет собирать мусор, поэтому вы не увидите никаких изменений в памяти после удаления всех фреймов,Если вам нужна память, из того, что вы должны освободить, вам нужно собрать мусор в кадре.

...