Как минимизировать потерянные файловые дескрипторы в Android? - PullRequest
0 голосов
/ 03 сентября 2018

У меня проблема с приложением Android, которое вызывает сбой, по-видимому, из-за отсутствия файловых дескрипторов. Строки ошибок из журнала:

E/CursorWindow(16009): Could not allocate CursorWindow '/data/data/mypackage.myapp/databases/mydb' of size 2097152 due to error -24.
E/        (16009): dup(1003) returned an error: Too many open files (24)
E/        (16009): EGL: dequue_buffer failed
F/OpenGLRenderer(16009): Encountered EGL error 12291 EGL_BAD_ALLOC during rendering
E/mono-rt (16009): no /proc/self/maps, not on linux?
E/mono-rt (16009):
E/mono-rt (16009):
E/mono-rt (16009): No native Android stacktrace (see debuggerd output).
E/mono-rt (16009):
E/mono-rt (16009):
E/mono-rt (16009): =================================================================
E/mono-rt (16009): Got a SIGILL while executing native code. This usually indicates
E/mono-rt (16009): a fatal error in the mono runtime or one of the native libraries
E/mono-rt (16009): used by your application.
E/mono-rt (16009): =================================================================
E/mono-rt (16009):

(Для всех, кто интересуется mono-rt, это приложение Xamarin для Android).

Я могу поверить, что при параллельных загрузках (1 файловый дескриптор на сокет) и параллельном доступе к локальной базе данных SQLite (1 файловый дескриптор на курсор) мое приложение могло использовать довольно много файловых дескрипторов, но AIUI ограничен 1024 за процесс. Исследуя lsof, я обнаружил, что не только мое приложение, но и, очевидно, все они на устройстве, похоже, тратят много файловых дескрипторов. Те, что выглядят как низко висящие фрукты, заключаются в том, что все они, похоже, используют около 170 для отображаемых в памяти файлов TTF и 256 для несуществующих /dev/ashmem/dalvik-thread local mark stack (deleted) инодов.

Мне, конечно, не нужно, чтобы все файлы TTF в системе отображались в моем процессе: я совершенно уверен, что я никогда не собираюсь локализовать для Ugaritic, и даже если я в конечном итоге добавлю (скажем) Тайский и армянский они не будут использоваться одновременно. Есть ли способ закрыть дескрипторы файлов шрифтов, которые не используются активно?

Как насчет бесполезных Dalvik? Есть ли что-то, что я могу настроить, чтобы сделать более агрессивным закрытие удаленных временных файлов?

...