Best way to determine the memory footprint of an object

I’d like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Any advice is appreciated.

Thanks,
Wes

On 06.03.2007 08:40, Wes G. wrote:

I’d like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Marshal doesn’t text - the output is binary. But there’s another
problem: what do you regard an object’s size? Is it just the instance?
Is it the instance plus certain members like Arrays, Strings and
numbers? Is it the whole graph of objects reachable from your object?
In any case how do you deal with aliasing, i.e. objects referenced by
more than one object? etc.

Kind regards

robert

On Tue, Mar 06, 2007 at 04:40:37PM +0900, Wes G. wrote:

I’d like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Any advice is appreciated.

http://eigenclass.org/hiki.rb?ruby+space+overhead

A rule of thumb:

for normal objects the memory footprint is around 100 bytes plus 20
bytes per
instance variable (applies to objs. with <55 instance variables).

(Apply recursively if you want to consider referenced objects too.)

See the above link for more details regarding Arrays, Hashes, Symbols,
Structs, etc…

On 06/03/07, Wes G. [email protected] wrote:

I’d like to be able to estimate how much memory a given object requires.
What is the best/easiest way to do this? One thing that occurred to me
was the Marshal.dump the object to a file and look at that, although
looking at a textual representation of the object could be significantly
larger (I think).

Any advice is appreciated.

Take a look at object printing code in:

It prints reports like:
IV Table of object Complex(1.0, 2.0)
Flags = 2
Class = Complex
IV_TBL:

  • Bins: 11
  • Entries: 2
  • Bin 0:
    • Entry
      • Hash: 10802
      • Key: @real
      • Record: 1.0
  • Bin 1: empty
  • Bin 2: empty
  • Bin 3: empty
  • Bin 4: empty
  • Bin 5: empty
  • Bin 6: empty
  • Bin 7: empty
  • Bin 8:
    • Entry
      • Hash: 10810
      • Key: @image
      • Record: 2.0
  • Bin 9: empty
  • Bin 10: empty
    Memory use: 88 bytes

It only works with normal objects, not anything special (like strings,
arrays, hashes, floats etc.), becuase I never needed anything else.

Object uses memory for:

  • main data structure (flags, class pointer, table of instance
    variables pointer)
  • instance variable table
  • some extra storage for non-standard objects
  • associated singleton class, if any (if you include it in the count)
  • instance variables are objects unless they’re immediate values (if
    you include them in count)
  • some undefined memory allocator overhead for all of the above