2016-02-11 9 views
7

Bir hizmet başlatıyorum => arka plan hizmeti ve "yeni iş parçacığı" içinde bir dosya denetimi başlatılıyor, günlüğüne aşağıdakileri alıyorum: Uygulama duraklatıldı.Getting I/art: Açık eşzamanlı işaret süpürme GC boşaldı

Giriş: I/art: Explicit concurrent mark sweep GC freed 25935(1686KB) AllocSpace objects, 13(903KB) LOS objects, 39% free, 13MB/22MB, paused 649us total 43.569ms

Bu resimler (yaklaşık 20 resim) bir demet ihtiva sdcard içinde MyData dosyalar, sadece bir tarama bulunuyor.

** Scan = Fotoğraf adlarını alma ve bunları String'e kaydetme.

cevap

15

Bütün bunlar çöp toplayıcının işini yapması ve belleği boşaltmasıdır.

Eğer bunu sık sık (veya tutarlı bir şekilde) görüyorsanız, büyük olasılıkla çok fazla nesne ayırıyorsunuz demektir. Yaygın bir nedeni şöyle bir döngü içinde birçok (veya büyük bir kaç) nesneleri tahsis edilir:

for (int i = 0; i < 100; i++) { 
    Bitmap bmp = Bitmap.create(100, 100, Bitmap.Config.ARGB_4444); 
} 

bu döngü vurmak her zaman, biz yüz yeni Bitmap nesneleri ayırmak.

GC taramalarını önlemenin en iyi yolu, nesne tahsis etmemek. Tabii ki Java'da nesneleri ayırmak zorundasınız, bu yüzden gereksiz yere tahsis etmediğinizden emin olmalısınız. Google'ın, GC olaylarından kaçınmak ve belleği düzgün bir şekilde yönetmek için ipuçları içeren bir sürümü olduğu, .

+1

Bir satırda 30 kez çalışan bir uygulama ile bu sorunu yaşıyorum ve kodda hiçbir şey değişti Sadece gri bir ekran olsun ve sonsuza dek bunu yapmaya devam ediyor. Android stüdyosu " – ObedMarsh

+0

Android Studio bir IDE'dir, cihazınızda çalışan kodla hiçbir ilgisi yoktur. Sonsuzca çalışan bir döngü varmış gibi geliyor. –

+0

Yeni bir öykünücü oluşturduğumda kod çalışıyor, ardından bir süre sonra şu anda kodda döngü yok. Bu sqllite kullanan bir temel not uygulaması, veritabanı atm 3 not gibi var. Bir sebepten dolayı bir imleç üzerinde yinelemeye çalıştığımda görülüyor. – ObedMarsh