2008-10-21 12 views
6

Mam obiekt statyczny w czasie wykonywania, który jest po prostu listą innych obiektów (int, ciągi, słownik, inne obiekty, itp.). Czy istnieje sposób na określenie pamięci używanej przez mój statyczny obiekt "lista innych obiektów" w środowisku wykonawczym? Byłoby to przydatne do celów oprzyrządowania i raportowania.Jaki jest ślad pamięci obiektu w środowisku wykonawczym w .NET?

Odpowiedz

2

Prawdopodobnie pytasz o coś, co możesz wywołać ze swojego kodu (co również chciałbym wiedzieć), ale czułem, że powinienem wspomnieć profilera Ants [http://www.red-gate.com/Products/ants_profiler/index.htm], w przypadku, gdy inni nie szukają czegoś tak konkretnego. Poinformuje Cię o wszystkich rodzajach informacji o kodzie podczas jego wykonywania, w tym o tym, ile pamięci jest używane.

Z ich strony internetowej ...

pamięć profilu zrozumieć, jak aplikacja wykorzystuje pamięć i zlokalizować wycieków pamięci. Profiler pamięci umożliwia robienie migawek w dowolnym punkcie w wykonaniu programu , dzięki czemu można sprawdzić, jaka pamięć jest w tym momencie używana. Możesz pobierać kilka migawek w różnych czasach podczas działania aplikacji, dzięki czemu można porównywać stany pamięci aplikacji .

+0

Naprawdę szukam programowego wdrożenia. Zgadzam się jednak, że ANTS Profiler może być z pewnością przydatny w odpowiednich sytuacjach :) – Bullines

3

sizeof może być stosowany na typów wartości istnieje również Marshal.SizeOf który może być używany z niektórych podpowiedzi do .NET:

http://www.pixelicious.net/2008/07/03/exception-trying-to-get-the-size-of-a-c-class-using-marshalsizeof

Ale ... to nie jest dokładnie to całkowita Koszt, ponieważ środowisko wykonawcze przydziela dodatkowe bajty dla klas takich jak bloki synchronizacji.

Jeśli jesteś naprawdę zainteresowany pomiaru tego typu rzeczy, jednak należy użyć API profilowania:

http://msdn.microsoft.com/en-us/library/ms404386.aspx

lub bezpłatne narzędzie jak WinDbg że można zrobić wszystkie rodzaje cudownych rzeczy.

1

Nie bez profilera. Jest wystarczająco twardy tylko dla jednej klasy - patrz here.

2

Wypróbuj bibliotekę debugowania SOS. To jest najlepsze. Artykuły here i here

0

Dzięki za odpowiedzi. Myślę, że mój początkowy plan ataku, ponieważ jestem pewien, że większość obiektów będzie można serializować, będzie mniej więcej tak:

using (MemoryStream memstream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    try 
    { 
     formatter.Serialize(memstream, myObjectOfObjects); 
     mem_footprint += memstream.Length; 
    } 
    catch 
    { 
     // not a serializable object 
    } 
} 
Powiązane problemy