SORU
19 ŞUBAT 2010, Cuma


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
19 ŞUBAT 2010, Cuma


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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008
  • Roger Huffman

    Roger Huffma

    4 ŞUBAT 2007