Android 如何调试:RealmError-打开的文件太多

Android 如何调试:RealmError-打开的文件太多,android,realm,Android,Realm,我使用Realm构建应用程序已经有一段时间了,但是我一直在关注这个问题 我目前正在使用领域插件:io.Realm:Realm-gradle插件:2.3.0 例外情况是: Fatal Exception: java.lang.Error: io.realm.exceptions.RealmError: Unrecoverable error. Too many open files in /home/cc/repo/realm/realm-java-release/realm/realm-libr

我使用Realm构建应用程序已经有一段时间了,但是我一直在关注这个问题

我目前正在使用领域插件:
io.Realm:Realm-gradle插件:2.3.0

例外情况是:

Fatal Exception: java.lang.Error: io.realm.exceptions.RealmError: Unrecoverable error. Too many open files in /home/cc/repo/realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 92
    at io.realm.AndroidNotifier.throwBackgroundException(AndroidNotifier.java:138)
    at io.realm.internal.async.QueryUpdateTask.run(QueryUpdateTask.java:128)
    at io.realm.internal.async.BgPriorityRunnable.run(BgPriorityRunnable.java:34)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
Caused by io.realm.exceptions.RealmError: Unrecoverable error. Too many open files in /home/cc/repo/realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 92
    at io.realm.internal.SharedRealm.nativeGetSharedRealm(SharedRealm.java)
    at io.realm.internal.SharedRealm.getInstance(SharedRealm.java:209)
    at io.realm.internal.SharedRealm.getInstance(SharedRealm.java:186)
    at io.realm.internal.async.QueryUpdateTask.run(QueryUpdateTask.java:80)
    at io.realm.internal.async.BgPriorityRunnable.run(BgPriorityRunnable.java:34)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
我(在应用程序运行时)查询了打开文件的数量
adb shell ls-l/proc//fd

运行时,我看到一个文件
userxxx.management/access\u control.new\u commit.cv
打开182次,
userxxx.lock
打开91次

任何提示或指示都将不胜感激! 干杯
Gavin

您需要检查打开封闭领域实例的位置。相同的问题在中描述。
Mr.在评论中解释了这一错误的原因:

打开的文件太多表示您在某种程度上打开了太多的领域,因为系统已经用完了文件描述符。这也可以解释内存问题。由于Realm正在缓存Realms pr.thread,这可能发生在不同的线程上,也可能是因为您正在创建许多不同的RealmChristian Melchior 2016年12月15日10:11


所以我想出了这个办法,就是使用Android设备监视器和一个小shell脚本:

#!/bin/bash
my_watch () {
    tput sc
    pid=$1; while [ true ]; do
        tput rc; tput el
        printf "$2" `adb shell ls -l /proc/${pid}/fd | wc -l`
        sleep .1
    done
    tput rc; tput ed;
}

clear

APP_NAME=${1:?missing application name}

pid=`adb shell ps | grep $1 | awk '{print $2}'`

echo "Watch number of files in use for App: $1 PID: $pid - Ctrl-C to stop"
my_watch $pid "Files in use %s"
(将上述内容保存在watch_usage.sh中,并使用
/watch_usage.sh com.application执行。例如,在终端窗口中,这将尝试告诉您应用程序当前使用的文件数)

当应用程序运行时,我注意到文件数量激增,然后我使用ADM的DDMS透视图查看当前线程列表。对于我的RealmTransactionQueue(在我的例子中)有很多线程(这应该是一个单线程(现在也是),但是当我第一次创建它时,我引入了一个小错误,这意味着它时不时地得到新版本)。。。我可以通过查看DDMS窗口中的每个线程并查看它们的起点来了解这一点

谢谢@sergey,你的直觉是正确的,这是因为线程失控

希望以上内容对将来的人有所帮助(如果下次不是我的话!)


Gav

我猜是针对未关闭的领域实例,并随机使用
new Thread().start()在一些地方,而不是某种形式的执行者,我将发布一个更新,显示我如何定位我的问题,但是的,我打开了比我预期的更多的线程,导致了比需要的更多的开放领域!