Jump to content

JNI ERROR (app bug): global reference table overflow (max=51200)


Recommended Posts

Posted (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". И ждать...

Видео логов работы приложения:

В хорошем качестве видео по ссылке:   https://drive.google.com/file/d/1Up8agxNhA8a9oWwd1GjP_fq_rFGv8gJt/view?usp=sharing

 

Лог:

logcat.txt

 

delphi 10.4  x32

fgx 1.11.2.0

 

Edited by s.fedotenko@gmail.com
Link to comment
Share on other sites

  • Administrators

Добрый вечер,

Для возможности использования Java классов из нативного кода используется JNI - это специальная прослойка между виртуальной машиной JAVA и нативным кодом. По скольку JVM работает со счетчиками ссылок на нативные объекты, а нативный код нет, то в JNI есть таблицы в которые занесены текущие ссылки из нативного кода на Java объекты. Эта таблица имеет ограничение на максимальный размер, которые может разнится между устройствами. 

Ошибка 

JNI ERROR (app bug): global reference table overflow (max=51200)

говорит о том, что данная таблица полностью заполнена количество используемых ссылок. Обычно причиной этому является утечка памяти. То есть ссылка на Java Объект захвачена, но не возвращена после использования.

Я посмотрю ваш демо проект и попозже отпишусь о результатах.

Link to comment
Share on other sites

  • Administrators

Проблему я локализовал. Причина в плавном скролинге списка и только в нем. По каким-то причинам, Андроид выполняет плавное прокручивание списка и это приводит к росту кеша объектов элементов. Что в конечном итоге укладывает приложение, так как создаются более 1000 компонентов. Утечки как таковой нет. Буду разбираться дальше,  почему Кеш увеличивается именно при плавной прокрутке.

Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...