2011-05-20 20 views
27

Aşağıda, ne kadar bellek kaldığını kontrol etme formülü (geçerli yığında ne kadar bellek kaldığını değil, uygulama çökmeden önce ne kadar bellek kullanılabileceğini değil). Bunun doğru olduğundan emin değilim, değil mi?Android: ne kadar bellek kaldığını kontrol etmek nasıl?

double max = Runtime.getRuntime().maxMemory(); //the maximum memory the app can use 
double heapSize = Runtime.getRuntime().totalMemory(); //current heap size 
double heapRemaining = Runtime.getRuntime().freeMemory(); //amount available in heap 
double nativeUsage = Debug.getNativeHeapAllocatedSize(); //is this right? I only want to account for native memory that my app is being "charged" for. Is this the proper way to account for that? 

//heapSize - heapRemaining = heapUsed + nativeUsage = totalUsage 
double remaining = max - (heapSize - heapRemaininng + nativeUsage); 
+0

Bir şeyi yanlış anlamış mıyım? Neden getNativeHeapFreeSize() 'http://goo.gl/wsBKT istediğini değil? – Pacerier

+1

maxMemory() ve heapSize() arasındaki fark, büyük bir bitişik ayırma için oldukça emin olabileceğiniz bellek miktarıdır. FreeMemory() ile gösterilen ek miktar, mevcut yığının içindeki şu anda ayrılmamış miktardır, yani bu miktarın bir kısmının muhtemelen parçalanmış olduğu, miktarının gerektiğinde yığının büyütülmesi için kullanılan artışa bağlı olduğu anlamına gelir. Bu artışın çoğu zaten kullanılmış ve geri döndü. Bu nedenle, yukarıdaki "kalan" numaranızı kullanmak, bitişik bir yığınta ek belleğe ihtiyacınız varsa riskli olabilir. – Carl

+0

Ne kadar belleğin olduğunu görmek, çeşitli maxMemory() değerleri için geliştirme sırasında bazı aşırı kullanım durumlarını test etmek ve uygulamanızın bunlarla başa çıkabildiğinden emin olmak için daha iyi bir yaklaşım olabileceğini görmek için dinamik olarak test yapmak yerine bunu eklemekteyim. Çünkü belli bir noktada bellek sınırlarınıza yaklaştığınızı fark ederseniz, yaptığınız her şeyden ötürü kullanıcı için kaba olmayan bir şekilde dışarı çıkmak zor olabilir. – Carl

cevap

21

Aşağıdaki kodu deneyin. Bu size sonra elde ettiğiniz sonuçları vermelidir (özellikle Pss alanı). o here

Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo(); 
Debug.getMemoryInfo(memoryInfo); 

String memMessage = String.format(
    "Memory: Pss=%.2f MB, Private=%.2f MB, Shared=%.2f MB", 
    memoryInfo.getTotalPss()/1024.0, 
    memoryInfo.getTotalPrivateDirty()/1024.0, 
    memoryInfo.getTotalSharedDirty()/1024.0); 
+1

Teşekkür ederiz! Bu yüzden, makalemin yorumu şu anki kullanılabilir belleği hesaplayabilirim: Runtime.getRuntime(). MaxMemory() - memoryInfo.getTotalPss()? Bu size doğru ve güvenli görünüyor mu? – ab11

+0

Bana iyi görünüyor (yine de denemedim ...). Öte yandan, maxMemory'nin paylaşımlı bellek de göz önünde bulundurulması mümkündür, çünkü bu VM tarafından tahsis edilebilecek maksimumdur. Bu konuda daha fazla bilgi için bakabilirim ... – Muzikant

+0

Yardımcı olduğu için yanıtlandığı için işaretlendim, ancak bu gerçekten belleği ölçmek için güvenilir bir yol gibi görünmüyordu. İstediğim şey, çoğu durumda bitmap'ler için ayrılan bellek miktarının olması gereken, başvurumun alındığı yerel bellek miktarını veren bir yöntemdir. getTotalPss(), bu doğru bir şekilde geri dönmek gibi görünmüyor. Bu benim için son çözüm, onun büyük değil: http://stackoverflow.com/questions/6205496/android-question-about-bitmaps-memory-usage-and-scaling – ab11

2

Bu eski bir iplik yaklaşık Daha okuyabilir, ancak bu iş gibi görünüyor:

Runtime.getRuntime().gc(); 
    long memoryAvailable = (Runtime.getRuntime().maxMemory() - 
     Runtime.getRuntime().totalMemory() + 
     Runtime.getRuntime().freeMemory()); 

totalMemory-freeMemory akım kullanılan bellektir. eklemek için

(maximum possible memory)-(current used memory)

Düzenleme:

Yani bu aşağı kaynar. Eğer Runtime.getRuntime() deneyebilirsiniz freeMemory, çöp toplama için kullanılabilir belleği sayılmaz gc(), sandığından rağmen bu kendi sonuçlarına sahip olabilir (UI iş parçacığında çalıştırılıyorsa görsel hıçkırık gibi).

İlgili konular