2012-01-02 2 views
1

Привет, я программирую диспетчер файлов с двумя панелями в java и сталкиваюсь с проблемой.Почему прокрутка JTable занимает столько памяти?

Всякий раз, когда я прокручиваю JTable, требуется около 8 М памяти ... Есть ли способ, как исправить это? Он останавливается каждый раз после использования 40-60 МБ памяти. Является ли это проблемой Swing?

Благодарим за ответы.

Редактировать

Я пытался понять, почему это занимает так много памяти. Теперь я знаю источник проблемы. Я сделал небольшую кнопку с этим действием. Преобразовано: jScrollPane1.repaint();.

Когда я ударил его 10 раз, я получил большие объемы памяти в диспетчере задач, а также в VisualVM. Но в VisualVM GC начинает собираться на 50 МБ и снижает его до 8 Мб. Но диспетчер окон все еще увеличивает свою ценность.

Метод перерисовки делает большие утечки памяти в окнах. Есть ли какие-либо исправления?

Edit2

Дальнейшее исследование этой проблемы дал мне это. Я попытался запустить эту программу на платформе Linux без утечки. В программе было использовано около 20 М памяти. Поэтому я запрограммировал небольшой поток, который вызывал метод перерисовки как на JScrollPanes. И, к моему удивлению, в Windows память машины росла до 110 М, но затем ОС начала сильно напрягаться по памяти.

Нить:

@Override 
public void run() { 
     while (true) { 
      jScrollPane1.repaint(); 
      jScrollPane2.repaint(); 
      try { 
       this.sleep(10); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

я делал нормальную копию/переименовывать/удалять операции также происходит через каталоги, с память не растет. Я заметил, что память также уменьшалась до 99M.

На резьбе мониторинга:

@Override 
public void run() { 
    while (true) { 
     aLabel.setText("Memory consumption: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()); 
     try { 
      this.sleep(200); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

номера были от 8М до 50М, а затем снова 8M. Поэтому сбор мусора был успешным. Итак, реальной проблемой является платформа Windows или совместимость JVM? Как trashgod предположил, что диспетчер задач не точен в получении потребления памяти, но память действительно используется процессом java.

+0

Возможно ли, что вы откроете файлы/каталоги, а не закрывая их? – MByD

+1

, пожалуйста, почему ваш JTable взял ..., можете ли вы объяснить, опубликуйте http://sscce.org/, все остальные снимки в темноте. – mKorbel

+1

8K ничего. Это может происходить из графики, которая должна быть обновлена, из временных объектов, созданных рендерером, вам просто все равно. –

ответ

1

Повторное использование FileSystemView.getFileSystemView() может быть проблемой, как предложено here и профилировано here. Это может помочь изменить ваш вопрос, чтобы включить sscce, который демонстрирует проблему. Использование профилировщика может предполагать масштаб и серьезность проблемы; Java VisualVM может быть уже установлен.

Менеджер задач Windows все еще увеличивает свою ценность.

Диспетчер задач Windows может быть несовместим, как предлагается here. В этом контексте результат jvisualvm может быть более надежным.

+0

Я понял, думаю. Я провел 3 часа тестирования и пришел к такому выводу ... Я запускаю свою программу на платформе Windows и запускаю VisualVM. Также я сделал небольшую нить, которая контролировала Runtime freememory. Я всегда получаю максимальную используемую память в куче 11 Мб. Но диспетчер задач Windows дает мне номера как 70 - 180 Мб. Итак ... Я запустил его на машине Linux, а диспетчер задач дал мне 20 Мб и 30 макс. Так что я думаю, что у microsoft есть некоторая плохая задача, перечисляющая или что-то в этом роде. – Animator

+0

Как наблюдал выше @JB Nizet, проблем не возникает. Я подозреваю, что результат диспетчера задач Windows может вводить в заблуждение, как это предлагается в этих [комментариях] (http://stackoverflow.com/a/8463014/230513). См. Также этот [ответ] (http://stackoverflow.com/a/8462992/230513). – trashgod

+0

Я пытался понять, почему так много памяти. Теперь я знаю источник проблемы.Я сделал небольшую кнопку с этим действием: «jScrollPane1.repaint();». Когда я ударил его 10 раз, я получил большие объемы памяти в диспетчере задач, а также в VisualVM. Но в VisualVM GC начинает собираться на 50 МБ и снижает его до 8 Мб. Но диспетчер окон все еще увеличивает свою ценность. Я думаю, должно быть какое-то исправление для перерисовки jScrollPane при прокрутке ... – Animator

0

никогда не использовать Thread#sleep во время EDT, что причина, почему вы получите un_expecting UsedMemory,

1) GUI Качели однопоточен

2) Качели GUI ждет всех событий сделано, все изменения делаются на экране один момент, в том числе использование Thread#sleep,

3) с помощью Thread#sleep вы можете моделировать и увидеть на экране un_expected перерисовки графического интерфейса, или значение не обновляется или перекрасить

4) у вас есть проблемы с Concurency in Swing

5) Я не вижу никаких причин для использования repaint() там, обратите внимание, что очень трудно метод локальной среды

6) использовать и завернуть вам код в

7), так как у меня есть несколько методов, когда требуется (намеренное) использование Thread#sleep, не простая работа без Controler покрыта весь EDT

+0

Эти два потока вызываются из-за тестирования. Метод repaint вызывал большие нагрузки памяти, поэтому я создал поток, который автоматически вызывал метод repaint. – Animator

+0

Также потоки не являются источником неожиданного использованияMemory - метод repaint является источником. Я не знаю, что вы имеете в виду с этим ответом на мою проблему. – Animator

+0

перенаправляет это на SwingWorker или Runnable # Thread, обрабатывая SwingxTimer или используя # Timer, тогда вы можете проверить что угодно в GUI SWing правильно, в противном случае ваш тест не должен быть точным, нет ничего о Java Esential Classes, там идет GUI, и многие из этих методов были получены от Native OS – mKorbel