Bellek yönetimine genel bakış

Android Runtime (ART) ve Dalvik sanal makine kullanımı sayfalara ayırma ve bellek eşleme (mmapping) kullanabilirsiniz. Bu, bir uygulamanın yeni nesneler ayırarak veya eşlenen sayfalara dokunarak değiştirdiği tüm belleğin RAM'de kalması ve sayfa dışına çıkarılamaması anlamına gelir. 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 bellek ortamları, her bellek ayırma işlemini izler. Bir bellek parçasının program tarafından artık kullanılmadığını belirledikten sonra, programcının müdahalesi olmadan bu parçayı yığına geri bırakır. Kullanılmayan belleği geri kazanma mekanizması yönetilen bellek ortamında çöp toplama olarak bilinir. Çöp toplamanın iki amacı vardır: Bir programda gelecekte erişilemeyen veri nesnelerini bulmak ve bu nesneler tarafından kullanılan kaynakları geri almak.

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, kısa süre önce ayrılan nesneler Genç nesile aittir. Bir nesne yeterince uzun süre etkin kalırsa tanıtılabilir ardından kalıcı nesile geçtik.

Her yığın neslinin, içindeki nesnelerin kullanabileceği bellek miktarı için kendi özel üst sınırı vardır. 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. Çöp toplama işleminin süresi, hangi neslin nesnelerini topladığını ve her nesilde kaç etkin nesne olduğunu belirler.

Çöp toplama işlemi oldukça hızlı olsa da uygulamanızın performansını etkileyebilir. Genellikle kodunuzda ne zaman bir çöp toplama etkinliği gerçekleşeceğini kontrol edemezsiniz. 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. Çöp toplama işlemi, animasyon gibi yoğun bir işlem döngüsünün ortasında veya müzik çalarken gerçekleşirse işleme 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, daha sık gerçekleşmesini veya normalden daha uzun sürmesini zorunlu kılacak türde çöp toplama etkinlikleri gerçekleştirebilir. Ö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 adlı mevcut bir işlemden ayrılı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 işleme eşlenir. 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 açıkça ayrılmış paylaşılan bellek bölgelerini (ashmem veya gralloc ile) kullanarak aynı dinamik RAM'i işlemler arasında paylaşır. Örneğin pencere yüzeylerinde, uygulama ile ekran birleştirici arasındaki belleği ve imleç arabellekleri , ve müşteriniz olabilir.

Ortak belleğin yaygın kullanımı nedeniyle, uygulamanızın ne kadar bellek kullandığına dikkat etmeniz gerekir. 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ıyla aynı değildir. 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 yığının sonunda kullanılmayan alan olduğunda küçültebilir. 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

Android, işlevsel bir çoklu görev ortamı sağlamak için her uygulamanın yığın boyutu için katı bir sınır belirler. Tam yığın boyutu sınırı, cihazın toplamda ne kadar RAM'e sahip olduğuna bağlı olarak cihazlar arasında değişiklik gösterir. 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 önbelleğe alır. 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ınmış 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). Uygulama davranışını doğrulamak ve düşük bellek kapasitesine sahip cihazlardaki kullanıcılarınız için deneyimi iyileştirmek amacıyla enstrümantasyon testleri yazabilmek için bu bellek stresi altındaki ortamı yeniden oluşturmaya çalışmanız önemlidir.

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

  

Aracı yükleme, yaygın bağımsız değişkenler ve hata işleme hakkında daha fazla bilgi için stressapptest dokümanlarına bakın.

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: Sistem zaten bellek baskısı altındayken boş bellekten daha büyük boyutlarda ayırma isteğinde bulunulması nedeniyle işleminiz için ölümcül, doğal bir kilitlenmedir.
  • 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ğırmalar Android 4.1 (API düzeyi 16) ve sonraki sürümlerde kullanılabilir ve işleminizle ilgili ayrıntılı bellek uyarıları sağlar.