Wie behandeln :java.util.gleichzeitige.TimeoutException: android.os.BinderProxy.finalize() timed out nach 10 Sekunden-Fehler?
Sehen wir eine Reihe von TimeoutExceptions
im GcWatcher.finalize, BinderProxy.finalize
, und PlainSocketImpl.finalize
. 90+% der Fälle auf Android 4.3. Wir bekommen Berichte von Crittercism aus, die Nutzer in das Feld ein.
Den Fehler ist eine variation von: "com.android.internal.BinderInternal$GcWatcher.finalize() timed out after 10 seconds
"
java.util.concurrent.TimeoutException: android.os.BinderProxy.finalize() timed out after 10 seconds
at android.os.BinderProxy.destroy(Native Method)
at android.os.BinderProxy.finalize(Binder.java:459)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
at java.lang.Thread.run(Thread.java:841)
Haben wir bisher noch nicht hatten kein Glück, reproduzieren Sie das problem im Haus oder herauszufinden, was möglicherweise verursacht haben.
Irgendwelche Ideen was kann das verursachen?
Irgendeine Idee, wie das zu Debuggen und finden Sie heraus, welcher Teil der app ist dies die Ursache?
Alles, wirft ein Licht auf das Problem hilft.
Mehr Stacktraces:
1 android.os.BinderProxy.destroy
2 android.os.BinderProxy.finalize Binder.java, line 482
3 java.lang.Daemons$FinalizerDaemon.doFinalize Daemons.java, line 187
4 java.lang.Daemons$FinalizerDaemon.run Daemons.java, line 170
5 java.lang.Thread.run Thread.java, line 841
2
1 java.lang.Object.wait
2 java.lang.Object.wait Object.java, line 401
3 java.lang.ref.ReferenceQueue.remove ReferenceQueue.java, line 102
4 java.lang.ref.ReferenceQueue.remove ReferenceQueue.java, line 73
5 java.lang.Daemons$FinalizerDaemon.run Daemons.java, line 170
6 java.lang.Thread.run
3
1 java.util.HashMap.newKeyIterator HashMap.java, line 907
2 java.util.HashMap$KeySet.iterator HashMap.java, line 913
3 java.util.HashSet.iterator HashSet.java, line 161
4 java.util.concurrent.ThreadPoolExecutor.interruptIdleWorkers ThreadPoolExecutor.java, line 755
5 java.util.concurrent.ThreadPoolExecutor.interruptIdleWorkers ThreadPoolExecutor.java, line 778
6 java.util.concurrent.ThreadPoolExecutor.shutdown ThreadPoolExecutor.java, line 1357
7 java.util.concurrent.ThreadPoolExecutor.finalize ThreadPoolExecutor.java, line 1443
8 java.lang.Daemons$FinalizerDaemon.doFinalize Daemons.java, line 187
9 java.lang.Daemons$FinalizerDaemon.run Daemons.java, line 170
10 java.lang.Thread.run
4
1 com.android.internal.os.BinderInternal$GcWatcher.finalize BinderInternal.java, line 47
2 java.lang.Daemons$FinalizerDaemon.doFinalize Daemons.java, line 187
3 java.lang.Daemons$FinalizerDaemon.run Daemons.java, line 170
4 java.lang.Thread.run
Niemals Geist, finden Sie bugzilla.mozilla.org/show_bug.cgi?id=864102 kann ich auch bestätigen, ist bei unseren apps, es riecht wie ein Google-Play-Dienste Problem
Vielen Dank für die Erinnerung, ich habe das volle stack-trace.
Die Codezeile, die den Fehler ausgelöst eingeführt wurde Version 4.3_r1, die Veröffentlichung war im 5. Juni 2013. Das problem ist passiert seitdem.
Android version 4.2.2 auch noch angefangen zu werfen, diese Ausnahme ist also vielleicht ein google play update, das ist die Quelle.
InformationsquelleAutor emmby | 2014-06-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vollständige Offenlegung - ich bin der Autor des zuvor erwähnten Rede in TLV DroidCon.
Hatte ich die chance mit diesem Thema zu befassen, das über viele Android-Anwendungen, und diskutieren Sie mit anderen Entwicklern, traf Sie - und wir alle haben uns an den gleichen Punkt: dieses Problem kann nicht vermieden werden, nur minimiert.
Nahm ich einen genaueren Blick auf die default-Implementierung der Android-Garbage collector-code, um besser zu verstehen, warum diese Ausnahme wird Ausgelöst, und auf was könnten die möglichen Ursachen. Ich fand sogar eine mögliche Ursache während der versuchsdurchführung.
Die Wurzel des Problems ist an der Stelle ein Gerät "Schlafen Geht" für eine Weile - das bedeutet, dass das OS entschieden hat, senken Sie den Verbrauch der Batterie durch beenden die meisten Nutzer Land-Prozesse für eine Weile, und drehen Bildschirm aus, die Verringerung der CPU-Zyklen, etc .. Die Art und Weise dies erfolgt ist - ist auf einem Linux-system-Ebene, wo die Prozesse werden Angehalten Mitte laufen. Dies kann passieren, zu jeder Zeit während der normalen Ausführung der Anwendung, aber es wird aufhören, an einem Nativen system nennen, da die Kontext-Umschaltung erfolgt auf der kernel-Ebene. So - dies ist, wo der Dalvik GC tritt in die Geschichte.
Die Dalvik GC-code (umgesetzt in der Dalvik-Projekt in den AOSP-Website) ist nicht ein komplizierter code. Der einfachste Weg ist es Arbeit ist abgedeckt in meiner DroidCon Folien. was ich nicht abdecken, ist die grundlegende GC Schleife an dem Punkt, wo der Sammler hat eine Liste der Objekte zu beenden (und zu zerstören). der loop-Logik auf der Basis vereinfacht werden können, wie diese:
finalize()
- und call-nativedestroy()
wenn erforderlich,end_timestamp
,end_timestamp - starting_timestamp
) und vergleichen Sie gegen einen hart codierten Wert für den timeout von 10 Sekunden,concurrent.TimeoutException
und kill den Prozess.Jetzt betrachten Sie das folgende Szenario:
Anwendung entlang läuft, tut seine Sache. dies ist nicht ein Benutzer-orientierte Anwendung, die im hintergrund läuft. Während dieses hintergrund-Betrieb werden die Objekte erstellt, verwendet und gesammelt werden müssen, um Speicher freizugeben. Anwendung nicht die Mühe mit einer Wakelock - wie wird sich dies auf die Batterie negativ, und scheint unnötig. dies bedeutet, dass die Anwendung ruft die GC von Zeit zu Zeit. Normalerweise wird der GC-Läufe abgeschlossen ist, ohne eine Anhängevorrichtung. Manchmal (sehr selten) das System wird entscheiden, Schlafen in der Mitte der GC laufen. Das wird passieren, wenn Sie Ihre Anwendung ausführen, die lange genug, und überwachen Sie den Dalvik-Speicher Protokolle genau. Nun - betrachten Sie die timestamp-Logik des basic-GC - Schleife, ist es möglich, das Gerät zu starten, die laufen, nehmen Sie eine start_stamp, und gehen Sie zu schlafen, die
destroy()
native Anruf auf ein system-Objekt. wenn es aufwacht und wieder den Lauf, derdestroy()
beendet, und die nächste end_stamp wird die Zeit, die diedestroy()
rufen Sie+die Zeit schlafen. Wenn der sleep-Zeit war lange, über 10 Sekunden, die gleichzeitige.timeout exception geworfen wird.Habe ich gesehen, das in der generierten Diagramme aus der Analyse python-script - für-Android-System-Anwendungen, nicht nur meine eigenen überwachten apps. sammeln Sie genug Protokolle, Sie werden schließlich sehen.
Bottom line:
Das Problem nicht vermieden werden kann - Sie werden es feststellen, wenn die app im hintergrund läuft. Können Sie mildern, indem Sie eine wakelock, und verhindern, dass das Gerät vom schlafen, aber das ist eine andere Geschichte insgesamt, und eine neue Form von Kopfschmerzen, und vielleicht noch einen anderen Vortrag in einem anderen con.
Können Sie minimieren das problem durch Verringerung der GC-Anrufe - damit ist das Szenario weniger wahrscheinlich. Tipps sind in den Folien.
Habe ich noch nicht die chance hatte, zu gehen über die Dalvik 2 (ein.k.eine KUNST) GC-code - das bietet eine neue Generationen-Komprimieren-Funktion oder durchgeführt keine Experimente auf einem Android-Lollipop.
Hinzugefügt 7/5/2015:
Nach der überprüfung der Crash-Berichte aggregation für diesen Absturz geben, es sieht aus wie diese Abstürze von version 5.0+ Android-Betriebssystem (Lollipop mit KUNST) nur .5% dieser crash geben. Dies bedeutet, dass die KUNST-GC verpasst hat, reduziert sich die Häufigkeit dieser Abstürze.
Hinzugefügt 6/1/2016:
Sieht aus wie das Android-Projekt hat eine Menge von Informationen auf, wie der GC arbeitet in Dalvik 2.0 (ein.k.eine KUNST). Sie können darüber Lesen Sie hier - Debugging ART Garbage Collection
. Es beschreibt außerdem einige Werkzeuge, um Informationen auf der GC Verhalten für Ihre app. Senden Sie eine SIGQUIT, um Ihre app Prozess im wesentlichen wird eine ANR und dump, die den Zustand der Anwendung in einer log-Datei für die Analyse.
entfernen Sie alle hintergrund-Verarbeitung erfolgt in Ihrem app wird erheblich dazu beitragen, verringern das problem.
Für was es Wert ist, dies geschieht immer noch in Marshmallow (6.0.1). Das heißt, ich habe immer nur diesen Fehler erhalten, sobald. Also es scheint nicht zu einem riesigen problem. Danke für deine ausführliche Erklärung.
Nach einiger Zeit bekam ich den Eindruck, dass die Festsetzung dieses problem in der OS ist sehr problematisch und erfordert eine enge Zusammenarbeit zwischen Google und den OEMs. Ich erwarte nicht, dass diese behoben werden in absehbarer Zeit.
Ich bin mit wakelock, aber immer noch begegnet diesem Problem auf Android 4.4.2. Meine app hat ein paar hintergrund-Operationen, aber vor allem entwickelt, um der Arbeit den ganzen Tag lang, während charge Kabel montiert. Gibt es eine andere Möglichkeit um dieses Problem zu verringern?
InformationsquelleAutor oba
Sehen wir dies ständig, alle über unsere app, mit Crashlytics. Der Absturz geschieht in der Regel Weg nach unten im Plattform-code. Eine kleine Auswahl:
Die Geräte, auf denen dies geschieht, sind überwiegend (aber nicht ausschließlich) werden die Geräte von Samsung hergestellt wird. Das konnte nur bedeuten, dass die meisten unserer Nutzer sind mit Samsung-Geräten; alternativ könnte es auf ein problem mit Samsung Geräten. Ich bin mir nicht wirklich sicher.
Ich nehme an, dass dies nicht wirklich deine Fragen beantworten, aber ich wollte nur bekräftigen, dass es scheint ziemlich allgemein, und nicht spezifisch für Ihre Anwendung.
Ich habe dieses Problem auf android 4.4.4 mit dem Gerät hergestellt von XIAOMI
Wollte nur erwähnen, dass wir sehen, die Mehrheit dieser stürzt auf samsung-tablets. Nicht sicher, was samsung anders gemacht hat, wie mit Tabletten behandeln, hintergrund-apps.
ich habe dieses Problem auf android 4.4.4. Gerät hergestellt von HUAWEI.
Meine app stürzt nach wenn ich Leck Kanarischen Bibliothek auf android 5.0.2 Samsung-Gerät. Wenn ich deaktivieren Sie die Bibliothek Initialisierung, die app funktioniert Prima.
InformationsquelleAutor kcoppock
Fand ich einige Folien zu diesem Thema.
http://de.slideshare.net/DroidConTLV/android-crash-analysis-and-the-dalvik-garbage-collector-tools-and-tips
In diesem gleitet der Autor sagt, dass es scheint ein problem mit der GC, wenn es eine Menge von Objekten oder riesige Objekte im heap. Die Folie umfassen auch einen Verweis auf eine Beispiel-app und einem python-Skript zu analysieren, dieses Problem.
https://github.com/oba2cat3/GCTest
https://github.com/oba2cat3/logcat2memorygraph
Außerdem fand ich einen Hinweis in Kommentar #3 auf dieser Seite: https://code.google.com/p/android/issues/detail?id=53418#c3
InformationsquelleAutor Christopher
Broadcast Receiver timeout nach 10 Sekunden. Möglicherweise Ihr tun einen asynchronen Aufruf (falsche) aus einem broadcast receiver und 4.3 tatsächlich erkennt.
Pardon, wenn ich falsch Liege, aber ich glaube nicht, dass der broadcast receiver timeout bewirkt, dass diese bestimmte Absturz. Es ist gute Praxis, um zu vermeiden, die 10er-Grenze, aber das ist ein anderes Thema, als dem Antragsteller mit.
Ich habe einfach 10 Sekunden auf das Gehirn. developer.android.com/training/articles/perf-anr.html IDK, wenn es den Absturz verursacht.
Ihr Punkt ist solide und eine gute übung. Aber der ursprüngliche poster hat eine bestimmte Frage zu einem bestimmten Satz von Geräten. Ich würde raten, andere Zuschauer von diesem post zu überprüfen, Christopher s Antwort und oba beantworten, wenn Sie sehen die gleichen Symptome (Samsung-Geräte (insb. Galaxy S 4), usw.)
Ich bin nicht hier, um bash-Gerät herstellt, es wäre gegen die AGB.
InformationsquelleAutor danny117
Lösten wir das problem durch beenden der
FinalizerWatchdogDaemon
.Können Sie die Methode aufrufen, die in Anwendung des Lebenszyklus, wie
attachBaseContext()
.Aus dem gleichen Grund können Sie auch das Telefon herstellen, um das problem zu beheben, es ist bis zu Ihnen.
Es hat geklappt. Aber ich weiß nicht, Warum es passiert ist?.
InformationsquelleAutor Enaoi
Eine Sache, die immer wahr ist, ist, dass in dieser Zeit das Gerät wäre erstickt Speicher (das ist normalerweise der Grund für GC, wahrscheinlich ausgelöst).
Wie erwähnt, von fast allen früheren Autoren, dieses Problem Oberflächen bei Android versucht zu laufen, GC, während die app im hintergrund. In den meisten Fällen, in denen wir beobachteten es, Benutzer angehalten, die app durch sperren Ihrem Bildschirm.
Dies kann auch ein Hinweis darauf Speicherleck irgendwo in der Anwendung, oder das Gerät wird auch geladen, schon.
Also, die einzige legitime Art zu minimieren, ist es:
InformationsquelleAutor Sankalp Sharma
Ja,ich bin nur tun, Beispiel~
Sollte dies nicht funktionieren, weil der ständige inlining. Ändern Sie das Feld Wert nicht auf den Wert inline für die Anrufer.
InformationsquelleAutor kot32
Den finalizeQueue vielleicht zu lang
ich denke, die java erfordern kann, GC.SuppressFinalize() & GC.ReRegisterForFinalize(), dass sich die Benutzer reduzieren die finalizedQueue Länge explizit
wenn die JVM' source-code verfügbar ist, kann die Umsetzung dieser Methode selbst, wie android ROM-maker
InformationsquelleAutor Yessy
Für Klassen, die Sie erstellen (dh. sind nicht Teil von Android) es ist möglich, zu vermeiden Absturz komplett.
Jede Klasse, die
finalize()
hat einige unvermeidliche Wahrscheinlichkeit, abzustürzen, wie beschrieben von @oba. Anstatt also mit Finalizer, um die Bereinigung durchführen, verwenden Sie einePhantomReferenceQueue
.Für ein Beispiel schauen Sie sich die Umsetzung in Reagieren Native: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/jni/DestructorThread.java
InformationsquelleAutor Ben