Android

Android Hafıza Yönetimi ve LMK (Low Memory Killer)

Android'tehafıza yönetimi ve süreçlerin (process)öldürülmesi konusu hepimizin bildiği üzere farklı bir yaklaşımla ele alınır:Android, birsürecin içindekiActivity kapatıldıktan sonra bilesistem daha fazla hafızaya ihtiyaç duyuncaya kadar o süreci hafızada tutar. Bu durumdaki s&uu...

Android'te hafıza yönetimi ve süreçlerin (process) öldürülmesi konusu hepimizin bildiği üzere farklı bir yaklaşımla ele alınır: Android, bir sürecin içindeki Activity kapatıldıktan sonra bile sistem daha fazla hafızaya ihtiyaç duyuncaya kadar o süreci hafızada tutar. Bu durumdaki süreçler, sistemin genel performansı üzerine kötü bir etkide bulunmazlar; hatta Activity tekrardan başlatıldığında ciddi performans artışı sağlarlar.

Buradaki ilginç konu, Android'in süreci nasıl sonlandırdığı ve bir süreci kapatmaya nasıl karar verdiği? Android bunun için bir LRU listesi tutar ve "süreç öldürmeye" bu listedeki en eski süreçten başlayarak gereksiz süreçleri hafizadan kaldırır. Android'in kaynak kodu içinde bu sürecin nasıl işlediğine bakacak olursak aşağıdaki detayları incelememiz yeterli olacaktır:

ActivityManagerService.java sınıfı, süreçleri önem sırası doğrultusunda takip eder (ön planda mı, servis olarak mı çalışıyor vs.) ve bu değerleri sürecin oom_adj parametresinde sürekli olarak güncel tutar.

 

NOT: OOM_ADJ parametresi Linux’ta çekirdeğe (kernel) "out of memory" durumunda hangi sürecin kapatılacağını seçmesi için yardımcı olur. Bu değere Linux Kernel 2.6 sürümünde /proc/{PID}/oom_adj parametresini kontrol ederek ulaşabilirsiniz. Bu değer ne kadar büyükse, out of memory durumunda bu sürecin kapatılma ihtimali o kadar yüksektir. 

 

Linux'daki standart LMK sadece bir durum altında çalışır, bu da hafızanın kritik şekilde az olmasıdır.

Lowmemorykiller.c dosyasına göz atalım. Şuradan ulaşabilirsiniz: http://goo.gl/9LQOdS. Bu LMK modülünün kodunu incelediğinizde çekirdek (kernel) tarafından kullanılan standart kullanımı haricinde, başka yeteneklere de sahip olduğunu görebilirsiniz. Kısacası LMK birden çok limit tanımlanmasına izin veriyor.

Örnek vermek gerekirse, "şayet boş hafıza alanı XXXX değerinin altına düşerse, oom_adj değeri bu değerden büyük olan süreçleri öldür", "şayet boş hafıza alanı YYYY değerinin altına düşerse, oom_adj değeri bu değerden büyük olan süreçleri kapat" gibi tanımlar yapabilirsiniz.

Android kaynak koduna bakarsak, ActivityManagerServer.java sınıfı içinde bunun için 6 farklı kategory tanımlanmış olduğunu görebilirsiniz.

FOREGROUND_APP

Bu process ön tarafta koşuyor, bundan dolayı bunu öldürmek istemiyoruz.

VISIBLE_APP

Bu process sadece kullanıcıya gösterilen activityleri barındırır bundan dolayı öldürmesini istemiyoruz.

SECONDARY_SERVER

Bu process ikinci sunucular barındırıyor, bu processing öldürülmesinin kullanıcı üzerinde bir etkisi olmayacak.

HIDDEN_APP

Bu uygulama kullanıcıya gösterilmeyen activity’leri host ediyor. Son kullanıcıyı direkt olarak etkilemeyeceğinden öldürülebilir.

CONTENT_PROVIDER

Bu process kendisini kullanan bir uygulama olmayan ve sadece content_provider içeren process’leri gösterir. Şayet bu content provider bir uygulama tarafından kullanılıyorsa bu değer foreground_activity’e yakın bir değer çevrilir.

EMPTY_APP

Bu process kendi içinde hiçbirşey barındırmaz.

 

Yukarıda bahsi geçen 6 seçenek, Android cihazlarda ayarlanmıştır. Bu parametrelere denk gelen uygulamaların öldürülmesi için cihaz kapasitesine göre kullandığınız ROM'un inşa aşamasında üretici tarafından belirlenmiş limitler ayarlanmaktadır.

Cihazınıza Android Debug Bridge (ADB) ile kabuk (shell) erişimi sağladıktan sonra aşağıdaki komutu çalıştırıp cihazınız için yapılmış öntanımlı ayarlara ulaşabilirsiniz.

[code]cat "/sys/module/lowmemorykiller/parameters/minfree"[/code]

Çıktı aşağıdakine benzer şekilde 6 adet değer içerecektir:

1536, 2048, 4096, 5120, 5632, 6144

Bu arada Turkcell'in T30 model telefonunda bu değerler şöyle:

Örnek değerlerimizden devam edelim. Bu değerler page cinsindendir, bunları kilobyte'a çevirebilmek için 4 ile çarpmamız gerekiyor.

1 page = 4 kilobyte olduğundan dolayı.

FOREGROUND_APP

6 MB

VISIBLE_APP

8 MB

SECONDARY_SERVER

16 MB

HIDDEN_APP

20 MB

CONTENT_PROVIDER

22 MB

EMPTY_APP

24 MB

 

Bu tablodaki yerleşimden anlayacağınız üzere, yukarıda bu tipte uygulamaların öldürülmeye başlanacağı eşik değerlerini elde etmiş oluruz. Cihazınızda bu ayarlarla oynayarak optimum performans değerlerini elde edebilirsiniz.

[code]echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree[/code]

Yukarıdaki gibi bir komut ile çalışan cihazınız üzerinde bu değişiklikleri yapabilirsiniz. Buradaki önemli nokta bu ayarların cihazınızı restart ettikten sonra fabrika değerlerine dönecek olmasıdır.

Happy Coding & Hacking :).

Yorumlar

Görkem Çetin
08.01.2014 - 01:40

Eline sağlık Kerem, severek okuduğum bir yazı olmuş :)