Александр Кривошлык
← Все кейсы

Аналитические desktop-приложения

Устранение out-of-memory в JavaFX-графиках

Нашёл через profiler причину исчерпания памяти на графике примерно из 8 000 точек. Заменил отдельный Tooltip для каждой точки одним переиспользуемым popup.

Задача

График примерно на 8 000 точек мог исчерпать память: приложение заранее создавало отдельный Tooltip для каждой точки.

Моя ответственность

Диагностировал причину потребления памяти и реализовал переиспользуемую интерактивную подсказку.

Результат

Тот же график открывается без out-of-memory. Одна интерактивная подсказка переиспользуется для всех точек.

≈ 8 000

точек на графике, который после исправления открывался без out-of-memory

1 popup

переиспользуемая подсказка вместо отдельной для каждой точки

Диагностика потребления памяти

Profiler показал тысячи tooltip/popup-объектов и связанные элементы JavaFX window/scene graph. Именно их количество создавало основной объём потребления памяти.

Это особенность реализации приложения: библиотека графиков не требует отдельного popup-окна для каждой точки.

До · отдельный Tooltip на точкуОколо 8 000 точек → тысячи popup и связанных scene graph → out-of-memory
После · один popup на графикТекущая точка → обновление содержимого и положения общей подсказки
Сравнение количества тяжёлых объектов, а не график замеров памяти. Точные значения в мегабайтах и процентах не сохранились.

Переиспользуемая подсказка

Заменил отдельные Tooltip одним переиспользуемым popup. При взаимодействии с графиком обновляются его содержимое и положение для текущей точки.

Результат

Количество тяжёлых popup-объектов перестало расти вместе с числом точек, а интерактивная подсказка осталась доступной. Тот же график примерно на 8 000 точек после исправления открывался без out-of-memory.

Сокращение памяти в мегабайтах или процентах не заявляется.