Android platformu, boş belleğin boşa harcanmış bellek olduğu önermesi üzerine çalışır. Her zaman mevcut tüm belleği kullanmaya çalışır. Örneğin, sistem, uygulamaları kapatıldıktan sonra bellekte tutar. Böylece kullanıcılar uygulamalara hızlıca geri dönebilir. Bu nedenle, Android cihazlar genellikle çok az boş bellekle çalışır. Bellek yönetimi, önemli sistem süreçleri ve birçok kullanıcı uygulaması arasında belleğin düzgün şekilde dağıtılması için hayati önem taşır.
Bu sayfada, Android'in sistem ve kullanıcı uygulamaları için belleği nasıl ayırdığıyla ilgili temel bilgiler verilmektedir. 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ı. CPU ve GPU'nun aynı RAM'e eriştiğini unutmayın.
Şekil 1. Bellek türleri: RAM, zRAM ve depolama
RAM, en hızlı bellek türüdür ancak genellikle boyutu sınırlıdır. Üst düzey cihazlarda genellikle en yüksek miktarda RAM bulunur.
zRAM, takas alanı için kullanılan bir RAM bölümüdür. Her şey zRAM'e yerleştirilirken sıkıştırılır, zRAM'den kopyalanırken ise sıkıştırması açılır. RAM'in bu bölümü, sayfalar zRAM'e taşındıkça veya zRAM'den çıkarıldıkça büyür ya da küçülür. Maksimum boyutu cihaz üreticileri belirleyebilir.
Depolama alanı, dosya sistemi ve tüm uygulamalar, kitaplıklar ve platform için dahil edilen nesne kodu gibi tüm kalıcı verileri içerir. Depolama alanı, diğer iki bellek türüne göre çok daha fazla kapasiteye sahiptir. Android'de, sık yazma işlemi bu belleğin yıpranmasına ve depolama ortamının ömrünün kısalmasına neden olabileceğinden, diğer Linux uygulamalarında olduğu gibi takas alanı için depolama alanı kullanılmaz.
Bellek 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 kategorilerde gruplandırılır:
- Önbelleğe alınmış: Depolama alanındaki bir dosya tarafından desteklenen bellek (ör. kod veya belleğe eşlenmiş dosyalar). İki tür önbelleğe alınmış bellek vardır:
- Özel: Bir işleme ait ve paylaşılmayan
- Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyasıdır. Boş belleği artırmak için
kswapdtarafından silinebilir. - Kirli (Dirty): Depolama alanındaki dosyanın değiştirilmiş kopyasıdır. Boş belleği artırmak için
kswapdtarafından zRAM'e taşınabilir veya zRAM'de sıkıştırılabilir.
- Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyasıdır. Boş belleği artırmak 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.
kswapdtarafından silinerek boş bellek artırılabilir. - Kirli (Dirty): Depolama alanındaki dosyanın değiştirilmiş kopyasıdır.
kswapdkadar boş bellek elde etmek için depolama alanındaki dosyaya geri yazma işlemlerine izin verir veyamsync()ya damunmap()açıkça kullanılır.
- Temiz: Depolama alanındaki dosyanın değiştirilmemiş kopyasıdır.
- Özel: Bir işleme ait ve paylaşılmayan
- Anonim: Depolama alanındaki bir dosya tarafından desteklenmeyen bellek (örneğin,
mmap()tarafındanMAP_ANONYMOUSişareti ayarlanarak ayrılan)- Kirli: Boş belleği artırmak için
kswapdile zRAM'de 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 tanıtılan kavramlar, düşük bellek durumlarını yönetmek için önemlidir. Bu belgenin bir sonraki bölümünde bu özellikler daha ayrıntılı olarak açıklanmaktadı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 arka plan programı ve düşük bellekli sonlandırıcı.
çekirdek takas arka plan programı
Çekirdek takas arka plan 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 etkinleşir. 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 kazanmaya başlar. Boş bellek yüksek eşiğe ulaştığında kswapd bellek geri kazanmayı durdurur.
kswapd, depolama alanı tarafından desteklendiği ve değiştirilmediği için temiz sayfaları silerek geri alabilir. Bir işlem, silinmiş temiz bir sayfaya erişmeye çalışırsa sistem, sayfayı depolama alanından RAM'e kopyalar. Bu işleme talep üzerine sayfalama denir.
Şekil 2. Depolama alanıyla desteklenen temiz sayfa silindi
kswapd, önbelleğe alınmış özel kirli sayfaları ve anonim kirli sayfaları, sıkıştırıldıkları zRAM'e taşıyabilir. Bunu yaptığınızda RAM'de (boş sayfalar) kullanılabilir bellek açılır. Bir işlem, zRAM'deki kirli bir sayfaya dokunmaya çalışırsa sayfa sıkıştırılmamış hâlde RAM'e geri taşınır. Sıkıştırılmış bir sayfayla ilişkili işlem 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. Kirlenmiş sayfa, zRAM'e taşınır ve sıkıştırılır.
Düşük bellekli işlemleri sonlandırma
Çoğu zaman kswapd, sistem için yeterli bellek alanı boşaltamaz. Bu durumda sistem, belleğin azaldığını ve uygulamanın ayırdığı alanı azaltması gerektiğini bildirmek için
onTrimMemory()
kullanır. Bu yeterli olmazsa çekirdek, belleği boşaltmak için işlemleri sonlandırmaya başlar. Bunu yapmak için düşük bellek sorunu (LMK) özelliğini 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 "yetersiz bellek" puanı kullanır. Puanı yüksek olan işlemler önce sonlandırılır. Öncelikle arka plan uygulamaları, en son ise sistem işlemleri sonlandırılır. Aşağıdaki tabloda, LMK puanlama kategorileri yüksekten düşüğe doğru listelenmektedir. Birinci satırda, en yüksek puanlı kategorideki öğeler önce kaldırılır:
Şekil 4. Üstte yüksek puanlar, altta düşük puanlar olacak şekilde Android işlemleri
Yukarıdaki tablodaki çeşitli kategorilerin açıklamaları aşağıda verilmiştir:
Arka plan uygulamaları: Daha önce çalıştırılmış ancak şu anda etkin olmayan uygulamalar. LMK, önce en yüksek
oom_adj_scoredeğerine sahip olan arka plan uygulamalarını sonlandırır.Önceki uygulama: En son kullanılan arka plan uygulaması. Önceki uygulama, kullanıcının arka plan uygulamalarından birine geçmek yerine bu uygulamaya geçme olasılığı daha yüksek olduğundan arka plan uygulamalarına göre daha yüksek önceliğe (daha düşük puan) sahiptir.
Home uygulaması: Bu, başlatıcı uygulamasıdır. Bu uygulamayı sonlandırmak duvar kağıdının kaybolmasına neden olur.
Hizmetler: Hizmetler uygulamalar tarafından başlatılır ve buluta senkronize etme veya yükleme gibi işlemleri içerebilir.
Algılanabilir uygulamalar: Kullanıcı tarafından bir şekilde algılanabilen ön plan dışı uygulamalar (ör. küçük bir kullanıcı arayüzü gösteren bir arama işlemi çalıştırma veya müzik dinleme).
Ön planda çalışan uygulama: Şu anda kullanılan uygulama. Ön planda çalışan uygulamanın sonlandırılması, uygulama kilitlenmesi gibi görünür ve kullanıcıya cihazda bir sorun olduğunu düşündürebilir.
Kalıcı (hizmetler): Bunlar, telefon ve kablosuz gibi cihazın temel hizmetleridir.
Sistem: Sistem işlemleri. Bu işlemler sonlandırıldığında telefon yeniden başlatılıyor gibi görünebilir.
Yerel: Sistem tarafından kullanılan çok düşük düzeyli işlemler (ör.
kswapd).
Cihaz üreticileri LMK'nin davranışını değiştirebilir.
Bellekte kaplanan yerin hesaplanması
Çekirdek, sistemdeki tüm bellek sayfalarını izler.
Şekil 5. Farklı işlemler tarafından kullanılan sayfalar
Bir uygulamanın ne kadar bellek kullandığını belirlerken sistem, paylaşılan 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ı, konum hizmetini paylaşıyor olabilir. Bu durum, genel olarak hizmete ve her uygulamaya ait bellek miktarını belirlemeyi zorlaştırır.
Şekil 6. İki uygulama tarafından paylaşılan sayfalar (ortada)
Bir uygulamanın bellekte kapladığı yeri belirlemek için aşağıdaki metriklerden herhangi biri kullanılabilir:
- Yerleşik küme boyutu (RSS): Uygulama tarafından kullanılan paylaşılan ve paylaşılmayan sayfaların sayısı
- Orantılı küme boyutu (PSS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı ve paylaşılan sayfaların eşit dağılımı (örneğin, üç işlem 3 MB paylaşıyorsa her işlem PSS'de 1 MB alır)
- Tekil Küme Boyutu (USS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı (paylaşılan sayfalar dahil değildir)
PSS, sayfalar birden çok kez sayılmadığından işletim sisteminin tüm işlemler tarafından ne kadar bellek kullanıldığını bilmek istediği durumlarda faydalıdır. PSS'nin hesaplanması uzun sürer çünkü sistemin hangi sayfaların kaç işlem tarafından paylaşıldığını belirlemesi gerekir. RSS, paylaşılan ve paylaşılmayan sayfaları ayırt etmez (bu da hesaplamayı hızlandırır) ve bellek ayırmadaki değişiklikleri izlemek için daha uygundur.
Ek kaynaklar
- Bellek yönetimine genel bakış
- Süreçler ve Uygulama Yaşam Döngüsü
- Android'de bellek kullanımını anlama - Google I/O sunusu
- Android Memory and Games - Google I/O presentation
- Android low memory killer daemon
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Uygulama başlatma süresi