2015-10-28 2 views
0

У меня есть значительное приложение Java, который создает сложные структуры данных, описывающая рисунок, начиная с сырья и временными метками точек данных и отображения рисунка, анализируя его и т.д.Пытаясь найти утечку памяти в моем Java код свинг

Когда я пытаюсь обработать серию этих чертежей, я явно вишу на память в виде JScrollPane, который используется для хранения чертежа, но я не могу понять, почему. Переменная, удерживающая область прокрутки, переназначается с каждым новым загруженным файлом, но я заметил, что swing RepaintManager поддерживает список ранее отображаемых панелей в списке недействительных компонентов. Кажется, что тогда навешивается на хранилище для каждого чертежа, и вскоре я использую 1 ГБ памяти, когда я обрабатываю файлы поочередно и, следовательно, никогда не должен иметь более одного используемого объема памяти.

У меня есть дамп памяти и проанализирован с помощью анализатора памяти Eclipse и с помощью YourKit.

Вот что я считаю, чтобы быть дымящийся пистолет, как показано анализатором памяти в Eclipse:

enter image description here

Провели довольно долго, пытаясь углубиться в эту проблему. Я был бы очень благодарен за любые предложения о том, где моя ошибка может лежать или как обойти эту проблему.

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

+2

Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

+1

Вы удаляете старые прокрутки? Возможно, вместо того, чтобы создавать новые, вы должны просто повторно использовать существующее и изменить компонент viewportView – MadProgrammer

ответ

2

Как @MadProgrammer suggests, ваш настоящий код предположительно заменяет существующий JScrollPane экземпляр:

scrollPane = new JScrollPane(view); 

Вместо обновления компонента видовых через setViewportView():

scrollPane. setViewportView(view); 

Еще лучше, обновить содержание view непосредственно. Детали будут зависеть от вашей реализации, но validate() и repaint() представляют один подход.

Смежные вопросы