Android platformu, boş belleğin boşa harcanan bellek olduğu prensibiyle çalışır. Her zaman mevcut belleğin tamamını kullanmaya çalışır. Örneğin, sistem, kullanıcının hızlıca geri dönebilmesi için uygulamaları kapatıldıktan sonra bellekte tutar. Bu nedenle, Android cihazlar genellikle çok az boş bellekle çalışır. Bellek yönetimi, belleği önemli sistem süreçleri ve birçok kullanıcı uygulaması arasında uygun şekilde dağıtmak için çok önemlidir.
Bu sayfada, Android'in sistem ve kullanıcı uygulamaları için bellek ayırma işleminin temelleri ele alınmaktadır. Ayrıca, işletim sisteminin düşük bellek durumlarına nasıl tepki verdiği de açıklanmaktadır.
Bellek türleri
Android cihazlarda üç farklı bellek türü bulunur: RAM, zRAM ve depolama alanı. Hem CPU hem de GPU'nun aynı RAM'e eriştiğini unutmayın.
Şekil 1. Bellek türleri: RAM, zRAM ve depolama alanı
RAM en hızlı bellek türüdür ancak genellikle boyutu sınırlıdır. Üst düzey cihazlarda genellikle en fazla RAM bulunur.
zRAM, takas alanı için kullanılan RAM bölümlerinden biridir. Her şey zRAM'e yerleştirildiğinde sıkıştırılır ve zRAM'den kopyalandığında sıkıştırması kaldırılır. Sayfalar zRAM'e taşındığında veya zRAM'den çıkarıldığında RAM'in bu bölümü boyut olarak büyür veya küçülür. Cihaz üreticileri maksimum boyutu belirleyebilir.
Depolama alanı, dosya sistemi ve tüm uygulamalar, kitaplıklar ve platform için dahil edilen nesne kodu gibi kalıcı verilerin tümünü içerir. Depolama alanı, diğer iki bellek türüne kıyasla çok daha fazla kapasiteye sahiptir. Android'de depolama alanı, diğer Linux uygulamalarında olduğu gibi takas alanı için kullanılmaz. Bunun nedeni, sık yazma işleminin bu belleğin yıpranmasına ve depolama ortamının ömrünün kısalmasına neden olmasıdır.
Anı sayfaları
RAM sayfalara ayrılır. Genellikle her sayfa 4 KB bellek kullanır.
Sayfalar ücretsiz veya kullanılmış olarak kabul edilir. Boş sayfalar, kullanılmayan RAM'dir. Kullanılan sayfalar, sistemin etkin olarak kullandığı RAM'dir ve aşağıdaki kategorilere ayrılır:
- Önbelleğe alınmış: Depolama alanındaki bir dosyayla desteklenen bellek (ör. kod veya bellek haritalı dosyalar). İki tür önbelleğe alınmış bellek vardır:
- Özel: Bir işleme ait olup paylaşılmaz
- Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyasıdır. Boş bellek alanı açmak için
kswapd
ile silinebilir. - Kirli: Depolama alanındaki dosyanın değiştirilmiş kopyası; boş belleği artırmak için
kswapd
tarafından zRAM'e taşınabilir veya sıkıştırılabilir
- Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyasıdır. Boş bellek alanı açmak için
- Paylaşılan: Birden fazla işlem tarafından kullanılır
- Temiz: Depolama alanındaki dosyanın değiştirilmemiş kopyasıdır. Boş bellek alanı açmak için
kswapd
tarafından silinebilir. - Kirli: Depolama alanındaki dosyanın değiştirilmiş kopyasıdır. Depolama alanındaki dosyaya değişikliklerin geri yazılmasını sağlar. Bu işlem,
kswapd
ile veya açıkçamsync()
ya damunmap()
kullanılarak yapılabilir.
- Temiz: Depolama alanındaki dosyanın değiştirilmemiş kopyasıdır. Boş bellek alanı açmak için
- Özel: Bir işleme ait olup paylaşılmaz
- Anonim: Depolama alanındaki bir dosya tarafından desteklenmeyen bellek (örneğin,
MAP_ANONYMOUS
işareti ayarlanmışmmap()
tarafından ayrılan)- Kirli: Boş belleği artırmak için
kswapd
tarafından zRAM'e taşınabilir/sıkıştırılabilir
- Kirli: Boş belleği artırmak için
Sistem RAM'i etkin bir şekilde yönettiğinden, boş ve kullanılan sayfaların oranları zaman içinde değişir. Bu bölümde açıklanan kavramlar, bellek miktarının düşük olduğu durumları yönetmek için önemlidir. Bu belgenin bir sonraki bölümünde bu konular daha ayrıntılı olarak açıklanmıştır.
Düşük bellek yönetimi
Android'de, düşük bellek durumlarıyla başa çıkmak için iki temel mekanizma vardır: çekirdek takas hizmetli ve düşük bellek öldürücü.
çekirdek takas arka plan programı
Çekirdek takas hizmet programı (kswapd
), Linux çekirdeğinin bir parçasıdır ve kullanılan belleği boş belleğe dönüştürür. Daemon, cihazdaki boş bellek azaldığında etkin hale gelir. Linux çekirdeği, düşük ve yüksek boş bellek eşiklerini korur.
Boş bellek düşük eşiğin altına düştüğünde kswapd
bellek geri almaya başlar. Boş bellek yüksek eşiğe ulaştığında kswapd
bellek geri alma işlemini durdurur.
kswapd
, depolama alanında yedeklendikleri ve değiştirilmedikleri için temiz sayfaları silerek geri alabilir. Bir işlem, silinmiş temiz bir sayfayı adreslemeye çalışırsa sistem sayfayı depolama alanından RAM'e kopyalar. Bu işleme talep sayfası denir.
Şekil 2. Temiz sayfa, depolama alanı tarafından desteklenir, silindi
kswapd
, önbelleğe alınmış kirli gizli sayfaları ve kirli anonim sayfaları sıkıştırıldıkları zRAM'e taşıyabilir. Bu işlem, RAM'de kullanılabilir bellek (ücretsiz sayfalar) için yer açar. Bir işlem zRAM'deki kirli bir sayfaya dokunmaya çalışırsa sayfa sıkıştırılmaz ve RAM'e geri taşınır. Sıkıştırılmış bir sayfayla ilişkili süreç sonlandırılırsa sayfa zRAM'den silinir.
Boş bellek miktarı belirli bir eşiğin altına düşerse sistem işlemleri sonlandırmaya başlar.
Şekil 3. Kirli sayfa zRAM'e taşındı ve sıkıştırıldı
Bellek azalması
kswapd
çoğu zaman sistem için yeterli bellek alanı sağlayamaz. Bu durumda sistem, bir uygulamayı belleğin azaldığı ve ayırmalarını azaltması gerektiği konusunda bilgilendirmek için onTrimMemory()
kullanır. Bu yeterli olmazsa çekirdek, bellek boşaltmak için işlemleri öldürmeye başlar. Bunu yapmak için düşük bellek öldürücüyü (LMK) kullanır.
LMK, hangi işlemin sonlandırılacağına karar vermek için çalışan işlemlere öncelik vermek üzere oom_adj_score
adlı bir "bellek yetersizliği" puanı kullanır. Puanı yüksek olan işlemler önce kapatılır. Arka plan uygulamaları önce, sistem işlemleri ise en son kapatılır. Aşağıdaki tabloda, LMK puanlama kategorileri yüksekten düşüğe doğru listelenmiştir. İlk satırdaki en yüksek puana sahip kategorideki öğeler önce kaldırılır:
Şekil 4. Üstte yüksek puanlar, altta düşük puanlar bulunan Android işlemleri
Aşağıda, yukarıdaki tablodaki çeşitli kategorilerin açıklamaları verilmiştir:
Arka plan uygulamaları: Daha önce çalıştırılan ve şu anda etkin olmayan uygulamalar. LMK, önce en yüksek
oom_adj_score
değerine sahip olan arka plan uygulamasını kapatır.Önceki uygulama: En son kullanılan arka plan uygulaması. Kullanıcının arka plan uygulamalarından birine geçme olasılığından daha yüksek olduğu için önceki uygulama, arka plan uygulamalarından daha yüksek önceliğe (daha düşük puana) sahiptir.
Ana ekran uygulaması: Bu, başlatıcı uygulamasıdır. Bu uygulamayı kapatırsanız duvar kağıdı kaybolur.
Hizmetler: Hizmetler uygulamalar tarafından başlatılır ve senkronizasyon veya buluta yükleme işlemlerini içerebilir.
Algılanabilir uygulamalar: Küçük bir kullanıcı arayüzü gösteren bir arama işlemi çalıştırma veya müzik dinleme gibi kullanıcı tarafından bir şekilde algılanan, ön planda olmayan uygulamalar.
Ön plan uygulaması: Şu anda kullanılan uygulama. Ön plandaki uygulamanın kapatılması, uygulama kilitlenmesi gibi görünür ve kullanıcıya cihazda bir sorun olduğunu gösterebilir.
Kalıcı (hizmetler): Bunlar, telefon ve kablosuz ağ gibi cihazın temel hizmetleridir.
Sistem: Sistem işlemleri. Bu işlemler sonlandırılırken telefon yeniden başlatılıyormuş gibi görünebilir.
Yerel: Sistem tarafından kullanılan çok düşük düzeyli işlemler (örneğin,
kswapd
).
Cihaz üreticileri LMK'nin davranışını değiştirebilir.
Bellek ayak izini hesaplama
Çekirdek, sistemdeki tüm bellek sayfalarını izler.
Şekil 5. Farklı işlemler tarafından kullanılan sayfalar
Sistem, bir uygulama tarafından ne kadar bellek kullanıldığını belirlerken ortak sayfaları hesaba katmalıdır. Aynı hizmete veya kitaplığa erişen uygulamalar, bellek sayfalarını paylaşır. Örneğin, Google Play Hizmetleri ve bir oyun uygulaması bir konum hizmetini paylaşıyor olabilir. Bu durum, hizmetin ne kadarının her bir uygulamaya ait olduğunu belirlemeyi zorlaştırır.
Şekil 6. İki uygulama tarafından paylaşılan sayfalar (ortada)
Bir uygulamanın bellek kullanımını belirlemek için aşağıdaki metriklerden herhangi biri kullanılabilir:
- Yerleşik Set Boyutu (RSS): Uygulama tarafından kullanılan paylaşılan ve paylaşılmayan sayfaların sayısı
- Oransal Set Boyutu (PSS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı ve paylaşılan sayfaların eşit bir şekilde dağıtılması (örneğin, üç işlem 3 MB paylaşıyorsa her işlem PSS'de 1 MB alır)
- Benzersiz Set Boyutu (USS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı (paylaşılan sayfalar dahil değildir)
Sayfalar birden çok kez sayılmadığından PSS, tüm işlemler tarafından ne kadar bellek kullanıldığını öğrenmek isteyen işletim sistemi için kullanışlıdır. Sistemin hangi sayfaların kaç işlem tarafından paylaşıldığını belirlemesi gerektiğinden PSS'nin hesaplanması uzun sürer. RSS, paylaşılan ve paylaşılmayan sayfalar arasında ayrım yapmaz (bu da hesaplamayı hızlandırır) ve bellek ayırmadaki değişiklikleri izlemek için daha iyidir.
Ek kaynaklar
- Bellek yönetimine genel bakış
- Süreçler ve Uygulama Yaşam Döngüsü
- Android bellek kullanımını anlama - Google I/O sunusu
- Android Bellek ve Oyunlar - Google I/O sunusu
- Android düşük bellek öldürücü hizmeti
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Uygulama başlatma süresi