2017-02-03 1 views
0

Ich habe eine Anwendung mit Realm für eine kleine Weile gebaut, ich halte dieses Problem jedoch.Wie zu debuggen: RealmError - Zu viele Dateien geöffnet

Ich bin derzeit mit Realm Plugin: io.realm:realm-gradle-plugin:2.3.0

Ausnahme ist:

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) 

Ich habe abgefragt (während die App ausgeführt wurde), um die Anzahl der geöffneten Dateien adb shell ls -l /proc//fd

Beim Laufen ich sehe, Eine Datei userxxx.management/access_control.new_commit.cv ist 182 mal geöffnet und userxxx.lock ist 91 mal geöffnet.

Alle Hinweise oder Hinweise würden geschätzt! Cheers, Gavin

+1

Meine Vermutung geht für unclosed Realm Instanzen und mit zufällig 'new Thread() beginnen (.),' An Orten statt irgendeiner Form des Executor – EpicPandaForce

Antwort

1

Sie müssen Orte überprüfen, wo Sie einen nahen Bereich Instanzen öffnen. Das gleiche Problem wird unter this question beschrieben.
Herr Christian Melchior erklärt Ursache für diesen Fehler in Kommentar:

Zu viele Dateien offen zeigen, dass Sie irgendwie zu viele Realms eröffnen, da das System aus Filedeskriptoren ausgeführt wurde. Dies könnte auch die Speicherprobleme erklären. Da Realm Realms pr. thread das passiert entweder auf verschiedenen Threads oder weil du viele verschiedene Realms erstellst. - Christian Melchior 15. Dezember '16 bei 10:11

+0

ich ein Update veröffentlichen zeigen, wie ich meine Probleme lag , aber ja, ich hatte viel mehr Threads geöffnet als ich erwartet hatte, was zu viel mehr offenen Realms führte, als benötigt wurde! –

0

So ist die Art und Weise, die ich diese heraus war den Android-Device Monitor und einen kleinen Shell-Skript zu verwenden:

#!/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" 

(Save the oben in watch_usage.sh und Ausführen mit ./watch_usage.sh com.application.example in einem Terminal-Fenster, wird dies versuchen und Ihnen sagen, die Anzahl der Dateien, die Ihre Anwendung derzeit verwendet).

Während die Anwendung ausgeführt wurde, und ich bemerkte, dass die Anzahl der Dateien sprang, habe ich dann die DDMS-Perspektive von ADM verwendet, um die aktuelle Thread-Liste zu sehen. Es gab (in meinem Fall) eine Reihe von Threads für meine RealmTransactionQueue (das sollte ein Singleton sein (und jetzt ist), aber als ich es zum ersten Mal erstellte, führte ich einen kleinen Fehler ein, der bedeutete, dass es immer wieder neue Versionen bekam) ... Ich konnte das sehen, indem ich mir jeden Thread im DDMS-Fenster anschaute und sah, wo sie starteten.

Vielen Dank @sergey, Ihre Vermutung war richtig, das war wegen außer Kontrolle Threading!

Hoffe das oben genannte hilft jemandem in der Zukunft (wenn nicht ich das nächste Mal!).

Gav