Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find out the size of a .NET object

I'm trying to find out how much memory my objects take to see how many of them are ending up on the Large Object Heap (which is anything over 85,000 bytes).

Is it as simple as adding 4 for an int, 8 for a long, 4 (or 8 if you're on 64 bit) for any reference types etc for each object, or are there overheads for methods, properties, etc.?

like image 482
Matthew Steeples Avatar asked Nov 27 '08 15:11

Matthew Steeples


People also ask

How to calculate size of an object in c#?

One way is to use the GC. GetTotalMemory method to measure the amount of memory used before and after creating your object. This won't be perfect, but as long as you control the rest of the application you may get the information you are interested in.


2 Answers

Don't forget that the size of an actual object doesn't include the size of any objects it references.

The only things which are likely to end up on the large object heap are arrays and strings - other objects tends to be relatively small in themselves. Even an object with (say) 10 reference type variables (4 bytes each on x86) and 10 GUIDs (16 bytes each) is only going to take up about 208 bytes (there's a bit of overhead for the type reference and sync block).

Likewise when thinking about the size of an array, don't forget that if the element type is a reference type, then it's only the size of the references that count for the array itself. In other words, even if you've got an array with 20,000 elements, the size of the array object itself will only be just over 80K (on x86) even if it references a lot more data.

like image 138
Jon Skeet Avatar answered Sep 22 '22 22:09

Jon Skeet


Please follow these steps to get the size of the object.

  1. Go to Visual Studio 2010 Project Properties → Debug tab → Enable unmanaged code debugging.

  2. Go to the Visual Studio Debug menu → Options and SettingsDebuggingSymbols.

  3. There, enable Microsoft Symbol Server and leave the default (symbols may start a download).

  4. Set the breakpoint in your code, start debugging (F5).

  5. Open DebugWindowsImmediate Window.

  6. Enter .load sos.dll (Son of Strike)

  7. Enter !DumpHeap -type MyClass (the object you want to find the size of)

  8. From the output, locate the address of the object, i.e. (00a8197c)

    Address MT Size 00a8197c 00955124 36

  9. Next, !ObjSize 00a8197c

  10. There you go → sizeof(00a8197c) = 12 (0x48) bytes (MyClass)

like image 39
Gomes Avatar answered Sep 24 '22 22:09

Gomes