SORU
3 HAZİRAN 2014, Salı


Nasıl :java.açıklama.eşzamanlı.TimeoutException: android.os.BinderProxy.() finalize hataları 10 saniye sonra zaman aşımına uğradı?

* *6, PlainSocketImpl.finalize TimeoutExceptions çok sayıda görüyoruz. Bunların Android 4.3 oldu. Alanında kullanıcılardan Crittercism bu raporları alıyoruz.

enter image description here

Hata bir çeşididir: "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)

Şimdiye kadar herhangi bir şansa evde sorun üreten ya da buna neden olabilir ne olduğunu öğrenmek için yapmadık.

Bu neden olabilir ne herhangi bir fikir? Bu hata ayıklama ve bu nedenleri öğrenmek için nasıl bir fikriniz var mı? Bu konuya ışık tutan bir şey yardımcı olur.

Daha 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

CEVAP
24 ŞUBAT 2015, Salı


Tam açıklama - REL droidcon, daha önce sözü edilen konuşma, ben yazar değilim. Bir şansım incelemek için bu konu üzerinde pek çok Android uygulamalar ve tartışma ile diğer geliştiriciler ile karşılaştı ve hepimiz var aynı nokta: bu sorun olamaz Kaçınılması, sadece simge durumuna küçültülmüş.

Android Çöp toplayıcı kodu varsayılan uygulama ile daha yakından bakmak, bu özel durum neden daha iyi anlamak ve olası nedenleri ne olabilir aldım. Ben bile deneme sırasında olası bir kök neden bulundu. Kök sorun, bu noktada bir cihaz "Gider" Uyku için bir süre - bu demek oluyor ki OS verdi ve daha düşük Pil tüketimi uğradığın çoğu Kullanıcı Arazi işlemleri için bir süre, ve kapatma Ekran kapalı, azaltarak CPU döngüleri, vb. Bu işin yolu bu süreçleri orta vadede Duraklatılmış nerede Linux sistemi bir seviyede. Bu normal bir Uygulama yürütme sırasında herhangi bir zamanda olabilir, ama bağlam anahtarlama çekirdek düzeyinde olduğu gibi Yerel bir sistem çağrısı en durdurun. Dalvik GC hikayenin birleştiği bu yüzden. Dalvik GC kodu AOSP sitede Dalvik proje olarak uygulanan () kod karmaşık bir parça değil. Bu iş temel yolu, DroidCon benim slayt kaplıdır. kapak ne toplayıcı sonuçlandırmak için Nesnelerin listesini (ve yok) sahip olduğu Temel GC döngü noktasında. üsteki döngü mantığı bu gibi basitleştirilmiş olabilir: 1. al starting_timestamp 2. serbest bırakmak için nesnelerin listesini kaldırmak için nesne 3. nesne - () serbest sonuçlandırmak ve çağrı yerli yok() gerekirse. 4. al end_timestamp 5. (end_timestamp-starting_timestamp) ve 10 saniye sabit kodlanmış zaman aşımı değerini hesaplamak karşı karşılaştırın. 6. eğer zaman aşımı varsa, eşzamanlı atmak.özel durum zaman aşımı ve süreci öldürmek.

Şimdi şu senaryoyu inceleyin: Uygulama şeyi yapıyor birlikte çalışır. bu bir Kullanıcı bir uygulama ile karşı karşıya, o arka planda çalışır. Bu arka plan işlemi sırasında, Nesnelerin, kullanılan bellek serbest bırakmak için toplanması gerekir. Uygulama bu bataryayı olumsuz yönde etkileyecek bir Wakelock ile rahatsız değil ve gereksiz geliyor. bu Uygulama zaman zaman GC çağırmak anlamına gelir. Normalde GC çalışan bir aksama olmadan tamamlandı. Bazen (çok nadiren) Sistemi GC vadede ortasında Uyumaya karar verecek. Bu uygulama yeterince uzun çalıştırın ve yakından günlükleri izlemek olacak. Şimdi düşünün zaman damgası mantık temel GC döngü - mümkün aygıt için Başlat Çalıştır, bir start_stamp ve uyu de yok (yerli) çağrısı üzerine bir sistem nesnesi. uyanıp kaçmaya devam ettiğinde, yok() ve sonraki end_stamp aldığın zaman olacak son yok() uyku zamanı diyoruz. Eğer uyku zaman uzun olsaydı 10 saniye, eşzamanlı.zaman aşımı özel durum. Android Sistem Uygulamaları değil, sadece kendi takip uygulamalarım için grafikler analiz python betiği oluşturulan bu görülür. toplamak yeterli, sonunda göreceksiniz günlükleri.

Sonuç: Sorun Kaçınılması mümkün değildir - Eğer app arka planda çalışır eğer karşılaşacak. Bir wakelock alarak azaltmak ve uyku dan cihaz önlemek olabilir, ama bu tamamen farklı bir hikaye ve yeni bir baş ağrısı, belki başka bir con konuş. GC aramaları azaltarak problem - senaryoyu daha az Olası hale küçültebilirsiniz. ipuçları slaytları.

Henüz Dalvik 2 üzerine gitme fırsatım olmadı (bir.k.yeni bir Kuşak Sıkıştırma sunan ART) GC kod özelliği veya Lolipop işletim sistemi üzerinde herhangi bir deney yapıldı.

7/5/2015 ekledi: Bu kaza için Kaza raporları toplama inceledikten sonra, yazın Android OS 5.0 sürümü (SANAT ile lolipop) bu çöküyor sadece bu kaza türü, 5'ini benziyor. Bu SANAT GC değişiklikleri bu kaza sıklığı azaltılmış olduğu anlamına gelir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • itfigueres

    itfigueres

    12 EKİM 2013
  • TheTwistedFrequency

    TheTwistedFr

    26 NİSAN 2010
  • TROPFEST

    TROPFEST

    27 Mart 2007