[英]How to debug: RealmError - Too many files open
我使用Realm構建應用程序已有一段時間了,但是我一直遇到這個問題。
我當前正在使用Realm插件: io.realm:realm-gradle-plugin: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_control.new_commit.cv
已打開182次,而userxxx.lock
已打開91次。
任何提示或指針,將不勝感激! 干杯加文
您需要檢查打開封閉領域實例的位置。 在這個問題上描述了同樣的問題。
Christian Melchior先生在評論中解釋了此錯誤的原因:
打開的文件太多,表明您正在以某種方式打開太多的領域,因為系統用盡了文件描述符。 這也可以解釋內存問題。 由於Realm正在緩存Realms pr。 線程發生在不同的線程上,或者因為您創建了許多不同的領域。 – Christian Melchior 16年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.example
執行,這將嘗試告訴您應用程序當前正在使用的文件數)。
當應用程序運行時,我注意到文件數量跳了起來,然后我使用ADM的DDMS透視圖查看了當前的線程列表。 在我的情況下,我的RealmTransactionQueue有多個線程(應該是單例(現在是單例),但是當我第一次創建它時,我引入了一個小錯誤,這意味着它不時地獲得新版本) ...通過查看DDMS窗口中的每個線程並查看它們的開始位置,可以看到這一點。
謝謝@sergey,您的直覺是正確的,這是由於線程無法控制!
希望以上內容能對以后的人有所幫助(如果下次不幫我!)。
加夫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.