s.fedotenko@gmail.com Posted July 5, 2021 Posted July 5, 2021 (edited) Добрый день. Помогите разобраться с проблемой. Уже недели две бьюсь, пытаясь понять, что не так. Изначально, есть очень большой список, который выводится на fgCollectionView. Все было нормально, пока мне не пришла мысль скидывать элементы списка в файлы (нужно организовать что-то типа кэша). И я не нашел ничего проще, как сохранять в файл по событию OnBindItem. И вот тут началось... Что бы проверить работу, я пустил список на скроллирование с анимацией fgCollectionView1.ScrollToItem(fgCollectionView1.Count - 1, True); В этом случае список "прогоняется" полностью. Но в некоторый момент программа "слетает". Анализ логов говорит об ошибке global reference table overflow. Но что это вызывает мне не понятно. Наконец, мне удалось повторить проблему на тестовом примере. Взял пример из демонстраций CollectionViewScrollDemo. увеличил число итемов до 100000, и сделал скролл в конец списка с анимацией. Плюс, в OnBindItem добавил сохранение в файл. Но записывать в файл даже не пришлось. Ошибка возникала, если просто вставить в код формирование пути к файлу: Спойлер Path := TPath.GetSharedDocumentsPath + PathDelim + 'temp'; if not TDirectory.Exists(Path) then TDirectory.CreateDirectory(Path); и что здесь не так? CollectionView - Scrolling with problem.zip - сам пример. После запуска, нажать на кнопку "GO TO END". И ждать... Видео логов работы приложения: Спойлер My Application 2021-07-05 11-33-18 (convert-video-online.com) (2).mp4 В хорошем качестве видео по ссылке: https://drive.google.com/file/d/1Up8agxNhA8a9oWwd1GjP_fq_rFGv8gJt/view?usp=sharing Лог: logcat.txt delphi 10.4 x32 fgx 1.11.2.0 Edited July 5, 2021 by s.fedotenko@gmail.com
Administrators Yaroslav Brovin Posted July 5, 2021 Administrators Posted July 5, 2021 Добрый вечер, Для возможности использования Java классов из нативного кода используется JNI - это специальная прослойка между виртуальной машиной JAVA и нативным кодом. По скольку JVM работает со счетчиками ссылок на нативные объекты, а нативный код нет, то в JNI есть таблицы в которые занесены текущие ссылки из нативного кода на Java объекты. Эта таблица имеет ограничение на максимальный размер, которые может разнится между устройствами. Ошибка JNI ERROR (app bug): global reference table overflow (max=51200) говорит о том, что данная таблица полностью заполнена количество используемых ссылок. Обычно причиной этому является утечка памяти. То есть ссылка на Java Объект захвачена, но не возвращена после использования. Я посмотрю ваш демо проект и попозже отпишусь о результатах.
Administrators Yaroslav Brovin Posted July 7, 2021 Administrators Posted July 7, 2021 Проблему я локализовал. Причина в плавном скролинге списка и только в нем. По каким-то причинам, Андроид выполняет плавное прокручивание списка и это приводит к росту кеша объектов элементов. Что в конечном итоге укладывает приложение, так как создаются более 1000 компонентов. Утечки как таковой нет. Буду разбираться дальше, почему Кеш увеличивается именно при плавной прокрутке.
Administrators Yaroslav Brovin Posted May 7, 2022 Administrators Posted May 7, 2022 Исправлено в 1.4.2.0. 1
Recommended Posts