Bellek yönetimine genel bakış

Android Runtime (ART) ve Dalvik sanal makine kullanımı sayfalara ayırma ve bellek eşleme (mmapping) kullanabilirsiniz. Bu, uygulamadaki herhangi bir bellekte ya da projenin yürütülmesi veya yeni nesnelere veya eşlenmiş sayfalara dokunmaya çalışın; RAM'de kalır ve sayfa dışına çıkarılamıyor. Bir uygulamadan bellek serbest bırakmanın tek yolu, uygulamanın bulunduğu nesneye referansta bulunur ve bu da yardımcı olur. Bunun bir istisnası vardır: veya herhangi bir değişiklik yapılmadan, sistem bu belleği başka bir yerde kullanmak isterse, RAM dışında sayfa ayırıcı çıkarılabilir.

Bu sayfada, Android'in uygulama işlemlerini ve belleği nasıl yönettiği açıklanmaktadır. tahsis etme anlamına gelir. Belleği daha verimli bir şekilde yönetme hakkında daha fazla bilgi için öğrenmek için Uygulamanızın Belleğini Yönetin.

Çöp toplama

ART veya Dalvik sanal makinesi gibi yönetilen bir bellek ortamı her bellek tahsisini takip eder. Bir sonraki aşamaya bir bellek parçasının artık program tarafından kullanılmadığını, programcının müdahale etmesine gerek kalmadan bunları yığına geri yükler. Kullanılmayan belleği geri kazanma mekanizması yönetilen bellek ortamında çöp toplama olarak bilinir. Çöp toplama işleminin iki hedefi vardır: Bir programda gelecekte erişilemeyecek veri nesnelerini bulma; ve bu nesnelerin kullandığı kaynakları geri almaktır.

Android’in bellek yığını nesillere özgüdür. Yani, izlediği farklı ayırma gruplarını gerçeğe dönüştüğünü fark etmiş olursunuz. Örneğin, yakın zamanda ayrılan nesneler Genç nesil'e ait. Bir nesne yeterince uzun süre etkin kalırsa tanıtılabilir ardından kalıcı nesile geçtik.

Her yığın oluşturma için kendi özel üst sınırı vardır. bir hafıza kapasitesine sahip. Bir nesil her başladığında sağlamak için sistem bir atık toplama işlemi yürütür. etkinlik olduğunu gösterir. Atık toplama süresi hangi nesil nesneleri topladığına bağlıdır ve her nesilde kaç etkin nesne bulunduğuna bakılır.

Atık toplama çok hızlı bir işlem olsa da uygulamanızın performansını etkiler. Genelde bu kararı kodunuzdan bir atık toplama etkinliği gerçekleştiğinde ortaya çıkar. Sistemin ne zaman performans göstereceğini belirlemek için çalışan bir dizi kriteri vardır. her şeyi öğreteceğim. Kriterler karşılandığında sistem işlemi yürütmeyi durdurur ve atık toplamaya başlar. Eğer atık toplama, yoğun bir işleme döngüsünün ortasında gerçekleşir Örneğin animasyonda veya müzik çalarken işlem süresi uzayabilir. Bu artış, uygulamanızda kod yürütülmesinin verimli ve sorunsuz kare oluşturma için 16 ms. eşik değerini önerdi.

Ayrıca kod akışınız, çok modlu özelliklerle çalışan atık toplama etkinliklerini gerçekleşmeye zorlama veya normalden daha uzun süre dayanmasını sağlayabilirsiniz. Örneğin, bir alfanın her karesinde "for" döngüsünün en iç kısmı bir animasyon ortaya çıkarırsanız, bellek yığınınızı çok sayıda nesne bulunuyor. Bu durumda, çöp toplayıcı birden fazla atık yürütür ve uygulamanızın performansını düşürebilir.

Atık toplama hakkında daha fazla genel bilgi için Çöp toplama.

Anıyı paylaş

Gerekli her şey RAM'e sığması için Android, RAM sayfalarını işlemler arasında paylaşmaya çalışır. Google bunu aşağıdaki şekillerde yapabilirsiniz:

  • Her uygulama işlemi, Zygote adı verilen mevcut bir işlemden çatallanır. Zygote işlemi, sistem başlatıldığında ve yaygın olarak yüklendiğinde başlar çerçeve kodu ve kaynakları (etkinlik temaları gibi). Yeni bir uygulama işlemi başlatmak için sistem, Zygote sürecini çatallanır ve Uygulamanın kodunu yeni işlemde yükleyip çalıştırır. Bu yaklaşım, sisteme ayrılan RAM sayfalarının çoğunu çerçeve kodunu ve kaynaklarını kontrol edin.
  • Çoğu statik veri bir sürece saptırılır. Bu teknik, verilerin paylaşılmasını ve sağlar ve aynı zamanda her bir aşamanın devre dışı bırakabilirsiniz. Örnek statik veriler şunlardır: Dalvik kodu (önceden bağlı bir .odex öğesine yerleştirerek dosyası), uygulama kaynakları (kaynak tablosunu bir yapı olacak şekilde bu parçayı aynı hizaya getirirken APK'nın girişleri) ve geleneksel bir proje .so dosyalarında yerel kod gibi öğeler için kullanabilirsiniz.
  • Android birçok yerde aynı dinamiği paylaşır. Açıkça tahsis edilmiş işlemler arasında RAM paylaşılan bellek bölgeleri (ashmem veya gralloc ile). Örneğin pencere yüzeylerinde, uygulama ile ekran birleştirici arasındaki belleği ve imleç arabellekleri , ve müşteriniz olabilir.

Paylaşılan belleğin aşırı kullanımı nedeniyle, uygulamanızın kullandığı bellek miktarı özen gösteriyoruz. Uygulamanızın nasıl kullanıldığını RAM Kullanımınızı İnceleme.

Uygulama belleği ayırma ve yer açma

Dalvik yığını her uygulama işlemi için tek bir sanal bellek aralığı sunar. Bu tanım mantıksal yığın boyutunu büyütür. Bu da sistem tarafından tanımlanan bir sınıra kadar ekleyebilirsiniz.

Yığının mantıksal boyutu yığın tarafından kullanılan fiziksel bellek miktarıdır. Android, uygulamanızın yığınını incelerken Orantılı Küme Boyutu (PSS) adı verilen Bu da hem kirli hem de temiz sayfaların Bunlar diğer süreçlerle paylaşılan, ancak yalnızca ve bir uygulamayı paylaşan uygulama sayısına anlamına gelir. Bu (PSS) toplam, sistem fiziksel bellek ayak izinizdir. PSS hakkında daha fazla bilgi için RAM Kullanımınızı İnceleme rehberini inceleyin.

Dalvik yığın, mantıksal gösterir. Bu da Android'in birleştirip yığını birleştirin. Android mantıksal yığın boyutunu yalnızca depolama alanının sonunda yer alır. Ancak, sistem, yığın tarafından kullanılan fiziksel belleği azaltabilir. Çöp toplama işleminden sonra Dalvik yığında gezinir ve kullanılmayan sayfaları bulur, ardından geri dönüp madvise’ı kullanarak bu sayfaları çekirdeğe taşımaya çalışır. Bu nedenle, tahsisatlarının ve dağıtımlarının parçalar, tamamının (veya neredeyse hepsinin) dâhilinde tamamlanabilmesini sağlarlar. Ancak, küçük ayırmalardan belleği geri kazanmak, daha az verimli olmasının nedeni, küçük bir paylaştırma oranı, ortaya çıkacaktır.

Uygulama belleğini kısıtla

İşlevsel bir çoklu görev ortamı yaratmak için Android, yığın boyutuyla ilgili kesin bir sınır belirliyor ekleyebilirsiniz. Tam yığın boyutu sınırı değişiklik gösterir ne kadar RAM'e sahip olduğuna göre cihazlar arasında yardımcı oluyor. Uygulamanız daha fazla depolama alanı ayırmaya OutOfMemoryError alabilir.

Bazı durumlarda, ne kadar boş bir alan olduğunu belirlemek için mevcut cihazlarda kullanılabilir (örneğin, bir depoda ne kadar verinin güvenli olduğunu önbellek. Şu numarayı arayarak sisteme bu rakam için sorgu gönderebilirsiniz: getMemoryClass() Bu yöntem, megabayt kullanılabilir.

Uygulamalar arasında geçiş yapma

Kullanıcılar uygulamalar arasında geçiş yaptığında Android, kullanıcı tarafından görülmemesi veya bir web sitesinin müzik çalma gibi ön plan hizmetlerine önbellekte saklar. Örneğin, kullanıcı bir uygulamayı ilk kez başlattığında bunun için bir süreç oluşturulur; Ancak kullanıcı uygulamadan çıktığında bu işlem çıkmaz. Sistem, işlemi önbellekte tutar. Eğer Kullanıcı daha sonra uygulamaya döndüğünde sistem, süreci yeniden kullanır. Bu sayede uygulamanın geçiş sürecini hızlandırıyor.

Uygulamanızda önbelleğe alınan bir işlem varsa ve uygulamalar kaynakları koruyorsa henüz ihtiyaç duymadığı, kullanıcı uygulamayı kullanmıyorken bile sistemin yardımcı olabilir. Sistemde bellek gibi kaynaklar azaldıkça önbellekteki işlemleri sona erdirir. Sistem ayrıca en fazla belleğe sahip işlemleri hesaba katarak ve RAM'de yer açmak için bunları sonlandırabilir.

Not: Uygulamanız önbellekteyken ne kadar az bellek kullanır? ölmeme ve hızlıca devam edebilmek için o kadar iyi olur. Ancak, anlık sistem gereksinimlerine bağlı olarak, Google Analytics 4'te süreçlerin herhangi bir zamanda sonlandırılmasına yol açabilir.

Chrome OS ana makinesinde süreçlerin nasıl önbelleğe alındığı ön planda çalışmadığını ve Hangilerinin olacağını Android belirler ölebilirseniz, Süreçler ve İleti Dizileri rehberini inceleyin.

Bellek stres testi

Bellek stresi sorunları üst segment cihazlarda daha az yaygın olsa da sorunlara neden olabilir (Android (Go sürümü) çalıştıranlar gibi düşük RAM'li cihazlardaki kullanıcılar için). Paydaşlarla yapacağınız uygulamanızı doğrulamak amacıyla araç testleri yazabilmeniz için, bellek sıkıntısı olan bu ortamı yeniden oluşturun ve düşük bellek kapasiteli cihazlardaki kullanıcılarınızın deneyimini iyileştirebilirsiniz.

Stresli Uygulama Testi

Stresli Uygulama Testi (stressapptest) Çeşitli bellekleri test etmek için gerçekçi, yüksek yük durumları oluşturmaya yardımcı olan bir bellek arayüzü testidir. hem de donanım sınırlamalarını koruyabilir. Zaman ve hafıza sınırlamaları tanımlama olanağı sayesinde, yüksek bellek kapasiteli durumların gerçek dünyadaki karşılaşmalarını doğrulamak için enstrümantasyon yazmanıza olanak tanır. Örneğin, veri dosya sisteminizdeki statik kitaplığı aktarmak için aşağıdaki komutları kullanın: dosyayı yürütülebilir hale getirin ve 20 saniye boyunca 990 MB'lık bir stres testi yapın:
    adb push stressapptest /data/local/tmp/
    adb shell chmod 777 /data/local/tmp/stressapptest
    adb shell /data/local/tmp/stressapptest -s 20 -M 990

  

stressapptest sayfasını inceleyin. belgeleri, aracın yüklenmesi, sık karşılaşılan bağımsız değişkenler ve hata giderme hakkında daha fazla bilgi için ekleyebilirsiniz.

Stresapptest ile ilgili gözlemler

stressapptest gibi araçlar, serbest olandan daha büyük bellek ayırmaları istemek için kullanılabilir kullanılabilir. Bu tür bir istek, çeşitli uyarılara neden olabilir. Bu uyarıları dikkate almanız gerekir. olarak da bilinir. Düşük bellek kullanılabilirliği nedeniyle gönderilebilecek üç ana uyarı şunlardır:
  • SIGABRT: Bu, sistem zaten bellek baskısı altındayken boş bellekten daha büyük bir boyuttur.
  • SIGQUIT: Bir çekirdek bellek dökümü oluşturur ve araç testiniz tarafından algılandığında işlemi sonlandırır.
  • TRIM_MEMORY_EVENTS: Bu geri çağırma işlevleri Android 4.1 (API düzeyi 16) ve sonraki sürümlerde kullanılabilir ve işlemi için bellek uyarıları.