JTable в Java Swing не освобождает память (интенсивно используется String)

Входной шестнадцатеричный файл может содержать не менее полумиллиона строк данных. Следовательно, графический интерфейс должен отображать их все.

Текущая реализация:

  1. Создание JTable.
  2. Создание модели путем расширения класса DefaultTableModel в Swing. например, HexModel
  3. Создание массива строк длиной 0x10000, например. Строка [] dataString = новая строка [0x10000] Поскольку каждая запись адреса в шестнадцатеричном файле Intel может иметь максимум 0x10000 записей данных.
  4. Предварительно заполните этот массив String строкой GAP, например. *. Нам также нужно отображать пропуски шестнадцатеричного файла в графическом интерфейсе.
  5. Сохранение байтового массива данных из модели шестнадцатеричного файла (созданного путем анализа входного шестнадцатеричного файла) в массив String dataString путем итерации по всем записям данных текущей записи адреса.
  6. Создать массив String, например. rowString длины 0x12 для хранения строкового формата адреса, части данных и строки ASCII для части данных.
  7. Перебрать записи данных длиной 0xFFFF, то есть 0x10000 - 1, и сохранить следующее в массиве rowString. а. Сохраните адрес в первом индексе. б. Храните данные из массива dataString длиной 0x10. c. Сохранить строку ASCII. (Строка ASCII создается путем получения значения ASCII для каждого байта данных, добавления их в StringBuilder и преобразования в String) Наконец, добавьте массив rowString в HexModel.
  8. После завершения итерации для всех записей адресов и соответствующих записей данных HexModel обновляется в JTable.

Обратите внимание, что при запуске графического интерфейса нет проблем с производительностью. Только для шестнадцатеричного файла с полмиллионом записей (файл размером 10 МБ) требуется от 2 до 3 секунд.

Но потребление памяти - БОЛЬШАЯ ПРОБЛЕМА. Для шестнадцатеричного файла размером 10 МБ память занимает 250 МБ. Основная проблема заключается в том, что объем памяти не уменьшается, хотя я закрыл загруженный файл на панели с вкладками в графическом интерфейсе.

Я знаю, что String широко используется. Но как лучше всего справиться с этим вариантом использования?

Запросите ваши комментарии по этой проблеме с памятью.

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

Загружайте только соответствующие строки за раз, возможно, используя кеш. Здесь может быть полезен файл с отображением памяти, но только для создания строк / строк «по запросу». Некоторые метаданные о строках могут быть полезны для поиска и т. д. (В зависимости от данных / использования): эти метаданные должны быть небольшими по сравнению с полными данными и, возможно, предварительно загружены / вычислены. JTable прекрасно поддерживает разбиение по страницам.

user2864740 09.06.2018 08:14

На основе предоставленной вами информации разбивка на страницы должна быть хорошим подходом для загрузки необходимого количества строк на одной странице за раз. Однако в настоящее время потребление памяти 250 МБ не является проблемой, поскольку любой ПК или ноутбук имеет как минимум 2 или 4 ГБ оперативной памяти.

STaefi 09.06.2018 08:27

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

STaefi 09.06.2018 08:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
120
0

Другие вопросы по теме