Почему повторение setLabel () в SWING приводит к нехватке памяти? - PullRequest
0 голосов
/ 16 мая 2011

Переменные класса выглядят так:

Button[] tab_but = new Button[440];
static int ii;

После инициализации tab_but я тестирую следующую работу.

for (int j = 0; j < 9999; j++) {
  String newLabel = String.valueOf(ii);

  for (int i = 0; i < 440; i++) {
    tab_but[i].setLabel(newLabel);
  }

  ii += 1;
}

И, наконец, «вышло из памяти».

Когда я его профилировал, распределение Object [] быстро увеличивалось с его запуском.

Я думаю, что я сделал только замену метки, поэтому предыдущий объект метки (String) должен быть очищен. право

Почему происходит такая утечка памяти?

Пожалуйста, сообщите и спасибо.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Я сильно подозреваю, что есть то, что вы не показали нам здесь.10000 строк - это ничего с точки зрения памяти.Если каждая строка, скажем, 64 байта (и это почти наверняка больше, чем реальность), то эти 10000 строк занимают 640 КБ.Я предполагаю, что у вас гораздо больше памяти, чем это, и вы не установили максимальный размер кучи на что-то крошечное?

Не могли бы вы предоставить короткую, но полную программу, которая демонстрирует проблемуздесь?

Интересно, проблема не в строках , а в том, что у вас генерируется 4,4 миллиона событий пользовательского интерфейса - и потому что вы никогда не позволяетеЯ справляюсь с ними, они все накапливаются, и они не могут быть очищены.Это будет иметь больше смысла (хотя это еще не , что много объектов) - но я не уверен, почему вы увидите это в реальной жизни - очевидно, пример, который вы привели, не особеннореалистичный, и вы, должно быть, пришли к выводу, что ему не хватает памяти в более обычной программе ...

0 голосов
/ 16 мая 2011

Сборщик мусора в Java не мгновенный.Когда больше нет ссылок на объект, становится доступным для сбора мусора.

Вы создаете (и удаляете) 9999 String объектов.Вам не хватает памяти, прежде чем они могут быть собраны.

0 голосов
/ 16 мая 2011

Я считаю, что когда вы делаете String new Label = String.valueOf(ii);, вы создаете новую строку. Когда вы назначаете его метке с помощью setLabel(), сохраняется ссылка, которая будет перезаписана в следующий раз. Таким образом, утечка памяти.

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