Nasıl Android Uygulama bellek kullanımı keşfetmek muyum?
Nasıl hafıza Android Uygulama, benim programlı olarak kullanılan bulabilirim?
Bunu yapmak için bir yol vardır umarım. Ayrıca telefonu nasıl serbest bellek mi?
CEVAP
Linux gibi modern işletim sistemlerinde bellek kullanımı olduğunu unutmayınson derecekarmaşık ve zor bir alan anlamak için. Aslında gerçekten düzgün olsun ne olursa olsun yorumlama şansı oldukça düşüktür. (Hemen hemen her zaman diğer mühendisler ile bellek kullanımı numaralarını bakıyorum, her zaman sadece belli belirsiz bir sonuca neden olan aslında ne demek hakkında uzun bir tartışma var.)
Not: şimdi burada malzeme çok kapsar ve daha fazla Managing Your App's Memory kapsamlı belgeler çok daha güncel Android Devleti ile.
İlk iş hafıza Android yönetilen nasıl bir tartışma vardır: muhtemelen bu makalenin son kısmını okuyun
http://android-developers.blogspot.com/2010/02/service-api-changes-starting-with.html
Şimdi ActivityManager.() getMemoryİnfo bizim en üst düzey toplam bellek kullanımı bakmak için API. Bu çoğunlukla bir uygulama sistem arka plan işlemleri için daha fazla bellek olması geliyor nasıl ölçer, böylece hizmetler gibi gerekli işlemler öldürme başlatmak için yardıma ihtiyacım var. Saf Java uygulamaları, Java yığın sınırı var bu noktaya sistem stres edememek bir uygulama önlemek için bölgesinde olduğundan az miktarda olmalıdır.
Hata Ayıklama API bellek kullanımı konusunda çekirdek düzeyinde ham bilgi almak için alt düzey: http://developer.android.com/intl/de/reference/android/os/Debug.html#getMemoryInfo(android.os.Debug.MemoryInfo)
2.0 ile başlayarak, aynı zamanda, API, bir ActivityManager olduğunu unutmayın.getProcessMemoryİnfo, başka bir işlem hakkında bilgi almak için: http://developer.android.com/intl/de/reference/android/app/ActivityManager.html#getProcessMemoryInfo(int[])
Bu veriler, tüm düşük seviyeli Memoryİnfo bir yapı verir:
/** The proportional set size for dalvik. */
public int dalvikPss;
/** The private dirty pages used by dalvik. */
public int dalvikPrivateDirty;
/** The shared dirty pages used by dalvik. */
public int dalvikSharedDirty;
/** The proportional set size for the native heap. */
public int nativePss;
/** The private dirty pages used by the native heap. */
public int nativePrivateDirty;
/** The shared dirty pages used by the native heap. */
public int nativeSharedDirty;
/** The proportional set size for everything else. */
public int otherPss;
/** The private dirty pages used by everything else. */
public int otherPrivateDirty;
/** The shared dirty pages used by everything else. */
public int otherSharedDirty;
Ama arasındaki fark nedir olarak "", "" ve ""... Peki şimdi eğlence başlıyor. SharedDirty PrivateDirty Pss
Android hafıza (ve genel olarak Linux sistemleri) bir sürü aslında birden çok işlem arasında paylaşılıyor. Ne kadar süreçleri kullanır gerçekten belli değil. Disk belleği üst diske Ekle (Android kullanmıyoruz ki bırak takas) ve daha az açıktır.
Böylece olsaydın için tüm fiziksel RAM aslında eşlenen için her işlem, ve tüm bu süreçleri, olur muhtemelen sonunda bir sayı daha büyük daha gerçek toplam RAM.
Pss numarasını başka işlemler de o sayfayı kullanma oranı olarak ölçeklendirilmiş bir süreçte RAM bellek hesap paylaşımı içine alır metrik çekirdek hesaplar-temel olarak, her bir sayfa. Bu şekilde teoride, tüm işlemler pss kullanıyorlar toplam RAM görmek için ekleyebilirsiniz, ve pss işlemler arasında ağırlıklarıyla bir fikir edinmek için karşılaştırın.
Diğer ilginç metrik burada PrivateDirty, hangi temelde miktarda RAM içine işleyen olamaz çağrı için disk (değil destek tarafından aynı veriler üzerinde disk), ve değil paylaşılan diğer işler. Bu bakmak için başka bir yol bu işlemi uzak (ve muhtemelen hızlı bir şekilde önbelleğe alır ve diğer kullanımlar içerisinde kaybolan) gider sistemi mevcut olacak RAM.
Bu hemen hemen bunun için SDK API. Ancak cihaz ile bir geliştirici olarak yapabileceğiniz daha var.
Adb kullanarak, çalışan bir sistem bellek kullanımı ve hakkında bir sürü bilgi var. Bir ortak bir komut "adb shell dumpsys meminfo" çıkar baklayı bir demet hakkında bilgi hafıza kullanımını her işlem Java, içeren yukarıdaki bilgi yanı sıra çeşitli diğer şeyler. Ayrıca tek bir sürecin adı veya pıd görmek için "adb shell dumpsys meminfo sistemi" bana sistem süreci ver: . örneğin çakmak edebilirsiniz
** MEMINFO in pid 890 [system] ** native dalvik other total size: 10940 7047 N/A 17987 allocated: 8943 5516 N/A 14459 free: 336 1531 N/A 1867 (Pss): 4585 9282 11916 25783 (shared dirty): 2184 3596 916 6696 (priv dirty): 4504 5956 7456 17916 Objects Views: 149 ViewRoots: 4 AppContexts: 13 Activities: 0 Assets: 4 AssetManagers: 4 Local Binders: 141 Proxy Binders: 158 Death Recipients: 49 OpenSSL Sockets: 0 SQL heap: 205 dbFiles: 0 numPagers: 0 inactivePageKB: 0 activePageKB: 0
Üst bölümde ana bir, "boyut" toplam boyutu adresi uzayın belirli bir öbek, "tahsis" kb gerçek ayırmalarını öbek düşünüyor, "özgür" kalan kb boş öbek için ek tahsisat ve "pss" ve "IS kirli" olarak ele önce belirli sayfaları ile ilgili her yığınları.
Eğer sadece tüm işlemler arasında bellek kullanımını bakmak istiyorsanız, komutunu kullanabilirsiniz "". adb shell procrank Aynı sistemde bu çıktı gibi görünüyor:
PID Vss Rss Pss Uss cmdline 890 84456K 48668K 25850K 21284K system_server 1231 50748K 39088K 17587K 13792K com.android.launcher2 947 34488K 28528K 10834K 9308K com.android.wallpaper 987 26964K 26956K 8751K 7308K com.google.process.gapps 954 24300K 24296K 6249K 4824K com.android.phone 948 23020K 23016K 5864K 4748K com.android.inputmethod.latin 888 25728K 25724K 5774K 3668K zygote 977 24100K 24096K 5667K 4340K android.process.acore ... 59 336K 332K 99K 92K /system/bin/installd 60 396K 392K 93K 84K /system/bin/keystore 51 280K 276K 74K 68K /system/bin/servicemanager 54 256K 252K 69K 64K /system/bin/debuggerd
Burada Vss ve Rss sütunlar temelde gürültü (bunlar ileri adres alanı ve RAM kullanımı bir süreç, nerede olursa ekleyin RAM kullanım süreçlerini bir gülünç büyük sayı).
Pss önce gördüğümüz gibi, Uss Is Kirli.
Burada dikkat edilmesi gereken ilginç bir şey: ve Uss meminfo içinde gördüğümüz biraz daha (biraz daha) farklı Pss. Bu yüzden mi? İyi meminfo göre verileri toplamak için farklı bir çekirdek mekanizması procrank kullanır, ve biraz farklı sonuçlar veriyorlar. Bu yüzden mi? Açıkçası hiçbir fikrim yok. Procrank daha doğru olabilir sanırım... ama gerçekten, bu sadece Nokta bırakın: "herhangi bir bellek inanmayarak olsun; genellikle çok büyük bir tane bilgi al."
Son olarak "adb shell cat /proc/meminfo" genel bellek özetini sistemi kullanım sağlar. Bu komut yok Orada pek çok veri burada, sadece ilk birkaç numaraları tartışmaya değer (ve geriye kalanlar anlaşılan birkaç kişi ve benim soru bu birkaç kişi hakkında sık sık çıkan çelişkili açıklamalar):
MemTotal: 395144 kB MemFree: 184936 kB Buffers: 880 kB Cached: 84104 kB SwapCached: 0 kB
MemTotal toplam bellek miktarı mevcut çekirdek ve kullanıcı alanı (genellikle daha az fiziksel RAM cihazın beri biraz RAM gerektiği için radyo, DMA arabellek, vb).
MemFree hiç kullanılmayan RAM miktarıdır. Burada gördüğünüz numara çok yüksektir; genellikle bir Android sistem üzerinde bu işlemler çalışmasını sağlamak için bellek kullanımı için çalışıyoruz beri sadece birkaç MB olurdu
Önbelleğe alınan RAM dosya önbelleğe alır ve diğer bu tür şeyler için kullanılıyor. Tipik sistemleri ihtiyaç var 20 MB ya da öylesine için bunu önlemek için almak içine kötü belleği Birleşik Devletleri; Android RAM de katil ayarlı bir sistem özellikle emin olmak için arka plan süreçleri vardır öldürmeden önce önbelleğe alınan RAM tüketilen fazla onlara neden böyle bir anons.
Nasıl Python bellek kullanımı profil m...
Nasıl android güncel bellek kullanımı ...
Nasıl metin yatay ve dikey olarak Andr...
Nasıl Android bir URL açmak'benim...
Nasıl bir uygulama veya bir işlemin as...