Hangi bellek sorgusunu almak istediğinizi tanımınıza bağlıdır.
Genellikle, yığın belleğinin durumunu bilmek istersiniz, çünkü çok fazla bellek kullanırsa, OOM alır ve uygulamayı kilitlersiniz.
Bunun için aşağıdaki değerleri kontrol edebilirsiniz:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
"UsedMemInMB" değişkeni "maxHeapSizeInMB" değerine availHeapSizeInMB
ne kadar yaklaşırsa , sıfıra o kadar yaklaşır, OOM elde edersiniz. (Bellek parçalanması nedeniyle, bu sıfıra ulaşmadan ÖNCE OOM alabilirsiniz.)
Bellek kullanımının DDMS aracının gösterdiği de budur.
Alternatif olarak, tüm sistemin ne kadar kullandığı gerçek RAM kullanımı vardır - bunu hesaplamak için kabul edilen cevaba bakın .
Güncelleme: Android O, uygulamanıza yerel RAM'i de kullandığından (en azından Bitmaps depolaması için, bu genellikle büyük bellek kullanımının ana nedenidir) ve yalnızca yığın değil, işler değişti ve daha az OOM elde edersiniz (çünkü heap artık bit eşlemler içermiyor, burayı kontrol edin ), ancak bellek sızıntılarınız olduğundan şüpheleniyorsanız bellek kullanımına yine de dikkat etmelisiniz. Android O'da, eski sürümlerde OOM'ye neden olması gereken bellek sızıntılarınız varsa, siz onu yakalayamadan çökecek gibi görünüyor. Bellek kullanımını şu şekilde kontrol edebilirsiniz:
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Ancak, verileri gerçek zamanlı olarak bir grafik kullanarak gösteren IDE profil oluşturucusunu kullanmanın en iyisi olabileceğine inanıyorum.
Android O'daki iyi haber şu ki, OOM çok fazla büyük bitmap depolamasından dolayı çökmeler çok daha zor, ancak kötü haber şu ki, çalışma sırasında böyle bir durumu yakalamanın mümkün olduğunu düşünmüyorum.
DÜZENLE: Debug.getNativeHeapSize()
Uygulamanız için toplam maksimum belleği gösterdiği için zamanla değişiyor gibi görünüyor . Dolayısıyla bu işlevler, uygulamanızın ne kadar kullandığını göstermek için yalnızca profil oluşturucu için kullanılır.
Gerçek toplamı ve mevcut yerel RAM'i almak istiyorsanız, şunu kullanın:
val memoryInfo = ActivityManager.MemoryInfo()
(getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).getMemoryInfo(memoryInfo)
val nativeHeapSize = memoryInfo.totalMem
val nativeHeapFreeSize = memoryInfo.availMem
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Log.d("AppLog", "total:${Formatter.formatFileSize(this, nativeHeapSize)} " +
"free:${Formatter.formatFileSize(this, nativeHeapFreeSize)} " +
"used:${Formatter.formatFileSize(this, usedMemInBytes)} ($usedMemInPercentage%)")
Debug.getNativeHeapFreeSize()
.