Geliştirdiğim bir uygulamadaki bellek sızıntısını anlamak için elimden gelen her şeyi denemek için 4 tam gün harcadım, ancak işler uzun zaman önce anlam kazanmayı bıraktı.
Geliştirdiğim uygulama sosyal niteliktedir, bu nedenle Aktiviteler (P) profilini düşünün ve verileri içeren Aktiviteleri listeleyin - örneğin rozetler (B). Profilden bir rozet listesine, diğer profillere, diğer listelere vb. Atlayabilirsiniz.
Öyleyse, P1 -> B1 -> P2 -> B2 -> P3 -> B3, vb. Gibi bir akış hayal edin. Tutarlılık için, aynı kullanıcının profillerini ve rozetlerini yüklüyorum, bu nedenle her P sayfası aynıdır ve bu yüzden her B sayfası.
Sorunun genel özü şudur: Her sayfanın boyutuna bağlı olarak biraz gezindikten sonra, rastgele yerlerde (Bitmapler, Dizeler vb.) Bir yetersiz bellek istisnası alıyorum - bu tutarlı görünmüyor.
Neden hafızamın tükendiğini anlamak için akla gelebilecek her şeyi yaptıktan sonra, hiçbir şey bulamadım. Anlayamadığım şey, Android'in yükleme sırasında hafızası biterse ve bunun yerine çökerse neden P1, B1, vb .'yi öldürmediğidir. OnCreate () ve onRestoreInstanceState () yoluyla onlara geri dönersem, bu önceki faaliyetlerin ölmesini ve diriltilmesini beklerdim.
Bunu bir kenara bırakın - P1 -> B1 -> Geri -> B1 -> Geri -> B1 yapsam bile, yine de bir çökme yaşıyorum. Bu, bir tür bellek sızıntısı olduğunu gösterir, ancak hprof'u döktükten ve MAT ve JProfiler'ı kullandıktan sonra bile tam olarak belirleyemiyorum.
Web'den görüntü yüklemeyi devre dışı bıraktım (ve bunu telafi etmek ve testi adil hale getirmek için yüklenen test verilerini artırdım) ve görüntü önbelleğinin SoftReferences kullandığından emin oldum. Android aslında sahip olduğu birkaç SoftReference'ı serbest bırakmaya çalışıyor, ancak bellekten hemen önce çöküyor.
Rozet sayfaları web'den veri alır, bir BaseAdapter'dan bir EntityData dizisine yükler ve bir ListView'e besler (Aslında CommonsWare'in mükemmel MergeAdapter'ını kullanıyorum , ancak bu Rozet etkinliğinde zaten sadece 1 adaptör var, ama ben bu gerçeği her iki şekilde de belirtmek istedim)
Kodu inceledim ve sızacak hiçbir şey bulamadım. Bulabildiğim her şeyi ve hatta System.gc () sol ve sağdaki her şeyi temizledim ve geçersiz kıldım ama yine de uygulama çöküyor.
Hala yığındaki aktif olmayan faaliyetlerin neden biçilmediğini anlamıyorum ve bunu gerçekten anlamayı çok isterim.
Bu noktada, yardımcı olabilecek herhangi bir ipucu, tavsiye, çözüm arıyorum ...
Teşekkür ederim.
outOfMemory
hata alıyorum. Teşekkürler!