簡體   English   中英

如何調試:RealmError-打開太多文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM