我开发的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进行本地化,即使我最终会添加(例如)泰语和亚美尼亚语,它们不会同时使用。有什么办法可以关闭未使用的字体文件描述符?
没用的达尔维克呢?我可以配置一些东西来使其更积极地关闭已删除的临时文件吗?