Memory Heap Dumps verileri nasıl kullanılır?

Ne zaman bir Android uygulaması geliştirsek, tüm geliştiricilerin endişelendiği en yaygın şey uygulama tarafından belleğin kullanılmasıdır. Bunun nedeni, uygulamanız büyük miktarda bellek kullanıyorsa, popülasyonun çoğunluğunun düşük bellekli aygıt kullanması nedeniyle kullanıcılarınızı kaybedebilirsiniz. Geliştiriciler, uygulamada mevcut her bir bellek sızıntısını bulmaya çalışırlar, böylece uygulamalarını daha zayıf ve daha hızlı olacak şekilde optimize edebilirler. Ayrıca, hangi nesnelerin belirli bir zamanda belleği kullandığını öğrenirseniz, uygulamanızdaki bellek sızıntılarını gidermek daha kolay bir iş haline gelir.

Bu blogda, bellek sızıntılarını tanımlamak için bellek yığın döküm verisinin nasıl kullanılacağını öğreneceğiz. Öyleyse başlayalım.

Profiler hakkında

Android Studio’da, uygulamamızın CPU, bellek, ağ ve enerji kullanım bilgilerini sağlayan Profiler adlı bir şeye sahibiz. Bu bizim uygulama tarafından CPU, bellek, ağ ve enerji kullanımının grafiksel bir gösterimini göstermektedir. Bu veriler sayesinde kodumuzu optimize edebiliriz. Ancak bu dört örnekten CPU, bellek, ağ ve enerji, çoğunlukla her geliştirici tarafından kullanılan, Bellek Profilcisi’dir. Öyleyse, bu Bellek Profilcisi’nin ne olduğunu görelim ve ondan önce, bellek sızıntılarının nedenini öğreneceğiz ve ardından bunu Bellek Profilcisi yardımıyla belirlemeye çalışacağız.

Sorun

Hafıza Profilcisi hafıza sızıntılarını ve hafıza kaybını bulmada bize yardımcı olur.Bellek sızıntısı, çalışan programa erişilemez hale gelir, ancak yine de belleği kaplar.

Fakat Java ya da Kotlin’de Çöp Toplama diye bir şey var. Uygulamanız artık bazı nesneleri kullanmıyorsa, çöp toplayıcı kullanılmayan belleği yeniden yığına bırakır. Çöp toplama işlemi için JVM ilk önce, çalışan iş parçacığı ve yerel değişkenler gibi öbek dışından erişilebilen bir nesne olan Çöp Toplama Kökü’nü (GC Root) tanımlayacaktır. Daha sonra Çöp Toplama Kökü’nden erişilebilen tüm nesneler tanımlanır ve bu nesneler korunur. Ve son olarak, Çöp Toplama Kökü’nden erişilemeyen nesnelerin geri kalanı çöp olarak kabul edilir ve geri dönüştürülür.

Peki, Bellek Sızıntısı kavramı nerede ortaya çıkıyor?

Bellek sızıntılarıyla tanışmadıkça hayat güzeldi.

Bellek Kaçakları, nesneniz henüz yok edilmediğinde ortaya çıkar, ancak aynı zamanda, bu nesneyi kullanacak durumda değilsiniz. Böylece nesneniz hafızayı tutar ve bu hafızayı kullanamazsınız.Başka bir deyişle, programda asla kullanılamayan, ancak erişilebilir olan terk edilmiş nesneler nedeniyle bellek sızıntılarının ortaya çıktığını söyleyebiliriz.

Çözüm

Uygulamamızdaki bellek sızıntılarını bulmak için bellek profilleyicisini kullanabiliriz. Uygulamamızda hafıza profili açıcıyı açmak için aşağıdaki adımları izleyin:

  1. Tıklayın Görünüm> Araç Pencere> Profiler .
  2. Uygulamanızı hedef cihazda çalıştırın.
  3. CPU, bellek, ağ ve enerji kullanımı grafiğini göreceksiniz. Bellek Profiler’i açmak için bellek zaman çizelgesinde herhangi bir yeri tıklayın. Aşağıdaki ekran açılacaktır:

Buradan, iki nesne türü için bellek sızıntısını önleyebilirsiniz (temel olarak) Faaliyet ve Fragment. Bunlar hakkında endişeliyiz çünkü çok fazla hafıza tüketiyorlar. En iyi şey, sızıntıları manuel olarak saptamanıza gerek kalmaması, Android Studio sürüm 3.6 veya daha üst sürümlerinde, etkinliklerin ve parçaların bellek sızıntısı Bellek Profilcisi tarafından algılanır. Çünkü bu iki sınıfın tanımlanmış bir davranışı var. Öyleyse, bir profilci bu sınıfların bir sızıntısı olduğunu nasıl söyleyebilir? Aktivite için, eğer tahrip edilmiş fakat hala referans gösterilmişse, o zaman bir sızıntı var demektir. Fragments için, kendisiyle ilişkilendirilmiş bir FragmentManager görmezsek ve yine de başvuruda bulunulursa, sızıntı söz konusudur.

Bu nedenle, bir sızıntıyı tanımlamak için, bazı faaliyetler veya fragmanlar nedeniyle, yapmamız gereken ilk şey, yığın çöplüğünü yakalamaktır. Bakalım nasıl.

Bellek Yığın Dökümü

Bir yığın dökümü, uygulamamızdaki hangi nesnenin, yığın dökümü yakalama sırasında belleği kullandığını bulmak için kullanılır. Bir yığın dökümü, hala bellekte olan ve program tarafından kullanılmayacak olan nesneleri göstererek bellek sızıntılarını tespit etmemize yardımcı olabilir. Yığın dökümü yakalayarak aşağıdaki bilgileri alabilirsiniz:

  1. Her nesne tarafından kullanılan bellek.
  2. Kodda tutulan her nesnenin referansı.
  3. Bizim app tarafından tahsis edilen nesnenin türü.
  4. Bir nesnenin tahsis edildiği çağrı yığını.

Bir yığın dökümü yakalamak için, Bellek Profilcisi’nde “Dump Java heap” adı verilen bir seçeneğiniz vardır. Üstüne tıkla.

Aşağıdaki ekran size gösterilecektir:

Yanımızda birçok veri var. Bize sunulan dört sınıf var. Onlar:

  1. Tahsisler: Yığındaki tahsislerin veya örneklerin sayısını gösterir.
  2. Yerel Boyut: Bu nesne türü tarafından kullanılan (yalnızca Android 7.0 veya üzeri için görülebilir) toplam yerel bellek (bayt cinsinden) miktarıdır.
  3. Sığ Boyut: Nesnenin kendisi tarafından tüketilen hafızadır (bayt cinsinden).
  4. Tutulan Boyut: Bu sınıfın tüm örnekleri nedeniyle kullanılan hafızadır (bayt cinsinden).

Böylece, bu verileri kullanarak, dikkate değer sınıfları tanımlayabilirsiniz. Sınıf adlarından herhangi birine tıklarsanız, Bellek Profilcisi bu sınıfın örneğini gösteren bir Örnek Görünümü açacaktır.

Burada derinlik gibi yeni bir veri bulacaksınız. Derinlik, herhangi bir Çöp Toplama Kökü’nden seçilen örneğe kadar geçen en kısa atlama sayısıdır. Bir nesne Çöp Toplama Kökü’ne ne kadar yakınsa, GC Kökü’nden bu nesneye kadar birden fazla yol ve daha fazla çöp toplanması olasılığı daha yüksektir.

Yukarıdaki örnekte, kırmızı düğüm için sola referanslardan herhangi birinin kırılması durumunda, kırmızı düğüm erişilemez olacak ve çöp toplanacaktır. Ancak mavi düğüm için, çöp toplama istiyorsanız, yolu soldan sağa doğru kırmanız gerekir.

Örnek

Herhangi bir dinleyiciyi kullanırken, kullanılmadığında dinleyiciyi daima silmeliyiz, çünkü bunu yapmazsak, o zaman dinleyici GC Root’ta olacak ve asla çöp toplanmayacaktır. Bu nedenle, dinleyiciyi her zaman onPause () veya onStop () veya onDestroy () yönteminde kaydını silmeye çalışın . Aşağıdaki bir LocationListener örneğidir:

public class LocationListenerActivity extends Activity implements LocationUpdate{

  @Override
  public void onLocationChange(Location location){
    
  }
  
  @Override
  public void onStart(){
   LocationListener.get().register(this);
  }
  
  @Override
  public void onStop(){
   LocationListener.get().unregister(this);
  }

}

Eğer dinleyiciyi kaydettirmiyorsanız, o zaman dökümü java yığınında, LocationListener nedeniyle bellek sızıntısı olduğunu söyleyen bir durum göreceksiniz.

Sızıntıları bulmak için Bellek Profilleyicisinin yığın döküntüsündeki verileri kullanabilir ve daha iyi sonuçlar için kodu optimize edip düzeltebilirsiniz.

Umarım bugün yeni bir şeyler öğrenmişsindir.

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

GIPHY App Key not set. Please check settings

Yükleniyor…

0

Ne düşünüyorsun?

Android’de APK boyutunu küçültmek için R8 kullanma

Materyal ve Karanlık Tema Uygulamaları Oluşturun