views:

6341

answers:

6

I'm developing an application which currently have hundreds of objects created.

Is it possible to determine (or approximate) the memory allocated by an object (class instance)?

+3  A: 

The ANTS memory profiler will tell you exactly how much is allocated for each object/method/etc.

George Stocker
+12  A: 

You could use a memory profiler like

.NET Memory Profiler (http://memprofiler.com/)

or

CLR Profiler (free)

Rauhotz
A: 

Each "class" requires enough memory to hold all of it's jit-compiled code for all it's members that have been called by the runtime, (although if you don;t call a method for quite some time, the CLR can release that memory and re-jit it again if you call it again... plus enough memory to hold all static variables declared in the class... but this memory is allocated only once per class, no matter how many instances of the class you create.

For each instance of the class that you create, (and has not been Garbage collected) you can approximate the memory footprint by adding up the memory usage by each instance-based declared variable... (field)

reference variables (refs to other objects) take 4 or 8 bytes (32/64 bit OS ?) int16, Int32, Int64 take 2,4, or 8 bytes, respectively...

string variable takes exytra storage for some emta data elements, (plus the size of the address pointer)

In addition, each reference variable in an object could also be considered to "indirectly" include the memory taken up on the heap by the object it points to, although you would probably want to count that memory as bellonging to that object not this one that references it...

etc. etc.

Charles Bretana
I can approximate my own classes, but not other (.net controls, for instance)
FerranB
Strings take more memory than just a pointer. I think i measured about 18 bytes.
Rauhotz
yes, you're probably right. I was just being lazy...
Charles Bretana
+4  A: 

Here's a related post where we discussed determining the size of reference types.

John Sheehan
+2  A: 

To get a general sense for the memory allocation in your application, use the following sos command in WinDbg

!dumpheap -stat

Note that !dumpheap only gives you the bytes of the object type itself, and doesn't include the bytes of any other object types that it might reference.

If you want to see the total held bytes (sum all the bytes of all objects referenced by your object) of a specific object type, use a memory profiler like dot Trace - http://www.jetbrains.com/profiler/

Sean
!objsize on the instance is also useful
Brian Rasmussen
+3  A: 

A coarse way could be this in-case you wanna know whats happening with a particular object

// Measure starting point memory use
GC_MemoryStart = System.GC.GetTotalMemory(true);

// Allocate a new byte array of 20000 elements (about 20000 bytes)
MyByteArray = new byte[20000];

// Obtain measurements after creating the new byte[]
GC_MemoryEnd = System.GC.GetTotalMemory(true);

// Ensure that the Array stays in memory and doesn't get optimized away
MyByteArray[1] = 20;

process wide stuff could be obtained perhaps like this

long Process_MemoryStart = 0;
Process MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;

hope this helps ;)

varun