2012-02-22 21 views
14

Bir C# programında, bellek kullanımını ölçmeye çalışıyorum.C# ile bellek kullanımını nasıl ölçebiliriz (Java’da yapabileceğimiz gibi)?

Bu Java fonksiyonunun C# eşdeğer bilmek istiyorum: yığın için ayrılan toplam belleği temsil

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 

. C# programm için ayrılan belleğin toplam boyutunu bilmek için buna ihtiyacım var.

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 

Şu anda kullanılan bellek almak için C# kullanırız:

Process_Memory = MyProcess.PrivateMemorySize64; 

Ama olduğuna tamamen emin değilim

Sonra Java Birlikte kullanılan bellek alabilirsiniz eşdeğer.

Özgeçmişimde C# uygulamam için toplam ayrılmış alanı nasıl alabilirim ve o anda geçerli kullanım t?

DÜZENLEME:

yanıtlarından

ve daha ileri araştırmalar bunu belirlemek ettik: numarasını ver kullanım

System.GC.GetTotalMemory(false); 

yılında

Güncel bellek bayt akımı y yönetilen bellekte ayrılmıştır. (http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx)

Bu yöntem düşük değer döndürmek ve ben getUsed()yılında Java ile alabilirsiniz gerçekten kullanımda tüm bellek temsili değil eminim. Aynı uygulama için java'da bellek 5MB'de başlar ve maksimum 125MB'a çıkar. C# ile yukarıdaki yöntemle 1'den 5 MB'ye çıkar.

MyProcess.PrivateMemorySize64; // return ~=25MB 

veya

MyProcess.WorkingSet64; //return ~=20MB 

kullanımda tüm belleğin daha doğru bir değer verin:

O gibi görünüyor. Ama bilmem gereken bir tane ...küresel ayrılmış bellek için

this article kullanmayı öneriyor: O 169MB hakkında, programm boyunca aynı değerini daimadönmek

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 

o Java ile karşılaştırıldığında adil görünüyor: 64MB’den 170’e MB maksimum

Hala bulunan tüm doğru cevap arıyorum

çok muğlak ve ben buldum belgeler undertand gerçekten emin değilim Windows bellek yönetimi ile çok aşina değilim:/

cevap

9

GC statik sınıfı, bu türden tüm bilgileri sağlar.

Muhtemelen GC.GetTotalMemory()'dan sonra.

DÜZENLEME:

ı inanmak o hafıza ayak izi halen köklü nesneleri dayalı egzersiz girişimleri. İşlem için ayrılan toplam boyut (yani, boş arabellek dahil) istiyorsanız, Process sınıfını kullanın. örneğin:

Process.GetCurrentProcess().WorkingSet64; 
+0

Evet bunu biliyorum ama Yönetilen yığındaki nesnelerin gerçek boyutunu verir, düşük bir değerdir. Bunun, tahsis edilen tüm hafızanın temsilcisi olduğunu sanmıyorum. –

+0

Öyleyse ham tahsis edilen hafızayı (yani yönetilen GC işlevselliğini dikkate almayan) istiyorsanız, 'Process' sınıfının tüm özelliklerini kullanmanız gerektiğine inanıyorum. 'PagedMemorySize64',' PrivateMemorySize64', vb – Tyson

+0

Teşekkürler, bu yüzden sadece processus toplam tahsis edilen bellek istiyorum eğer 'PrivateMemorySize64' yeterli olabilir düşünüyorum. Disk belleği olanı almıyorum ... –

13

İşte tek yönlü, GC kullanılarak: System.Diagnostics.PerformanceCounter kullanarak alternatif

public void Test() 
    { 
     long kbAtExecution = GC.GetTotalMemory(false)/1024; 

     // do stuff that uses memory here 

     long kbAfter1 = GC.GetTotalMemory(false)/1024; 
     long kbAfter2 = GC.GetTotalMemory(true)/1024; 

     Console.WriteLine(kbAtExecution + " Started with this kb."); 
     Console.WriteLine(kbAfter1 + " After the test."); 
     Console.WriteLine(kbAfter1 - kbAtExecution + " Amt. Added."); 
     Console.WriteLine(kbAfter2 + " Amt. After Collection"); 
     Console.WriteLine(kbAfter2 - kbAfter1 + " Amt. Collected by GC.");   
    } 

Veya çalışma kümesi bilgi almak için:

PerformanceCounter performanceCounter = new PerformanceCounter(); 

performanceCounter.CategoryName = "Process"; 

performanceCounter.CounterName = "Working Set"; 

performanceCounter.InstanceName = Process.GetCurrentProcess().ProcessName; 

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0")); 
+0

Cevabınız için teşekkürler. Yani, doktorun dediği gibi, “GC.GetTotalMemory (false)”, şu anda yönetilen bellekte ayrılmış olan bayt sayısını döndürür. Bence java'da getUse() ile eşdeğer olabilir. Ama tüm alanı nasıl ayırdım? System.Diagnostics.Process.GetCurrentProcess(). PrivateMemorySize64 'bu değeri temsil ediyor mu? –

+1

Bu doğru, evet. –

+0

İkinci çözüm için bir 'System.InvalidOperationException ' –

İlgili konular