The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Devel::MemUsed - returns how much memory as allocated since the Devel::MemUsed object construction

SYNOPSIS

    use Devel::MemUsed;
    
    my $memused = Devel::MemUsed->new();
    my %h = ( map { $_ => 1 } (1..100) );
    print "my hash allocated $memused bytes of memory\n";
    # for me 15632
    
    $memused->reset;
    
    my %h = ( map { $_ => 1 } (1..1000) );
    print "my hash allocated $memused bytes of memory\n";
    # for me 128104

DESCRIPTION

The purpose of this module is to see how much more memory is allocated after some lines of code that were executed. How much memory a huge hash takes or an eval of a "foreign" code.

Second purpose was to try Devel::Mallinfo and Contextual::Return. Devel::Mallinfo returns a hash filled with a mallinfo struct. This struct is defined in malloc.h and looks like this:

    struct mallinfo {
      int arena;    /* non-mmapped space allocated from system */
      int ordblks;  /* number of free chunks */
      int smblks;   /* number of fastbin blocks */
      int hblks;    /* number of mmapped regions */
      int hblkhd;   /* space in mmapped regions */
      int usmblks;  /* maximum total allocated space */
      int fsmblks;  /* space available in freed fastbin blocks */
      int uordblks; /* total allocated space */
      int fordblks; /* total free space */
      int keepcost; /* top-most, releasable (via malloc_trim) space */
    };

While writing the tests I have discovered two strange thinks.

1st is that:

    my $x1 = "x" x (100*1024);           # this one takes >200kB of memory ?!?!?
    my $x2 = eval '"x" x (100*1024)';    # this one just   ~100kB

2nd is that "x" x 128*1024 is a magic border when hblkhd start to increase. To get some meaning full results of memory usage I had to add uordblks + hblkhd together to get total memory usage. What is the real meaning of hblkhd and how it works with memory allocation of huge strings is unclear to me. If you know some details or explanation I'll be more then happy to hear it.

On YAPC Europe 2008 Darko Obradovic showed a code snipped using Devel::Mallinfo and a function mallinfo to get the statistics of memory allocated using malloc. On this same conference Damian Conway in his keynote was showing Contextual::Return. I put those two together and play around, hopefully producing something useful. :-)

PROPERTIES

METHODS

new()

Object constructor.

used()

Returns how many bytes of memory is used.

reset()

Reset the "counter" and start to count the memory allocated from the line of code where the reset() was called.

allocated_memory()

Return total number of mmap allocated memory since the start of the program.

THANKS TO

Darko Obradovic for his talk about http://www.cosair.com.

and

Damian Conway for his YAPC Europe 2008 keynote + the hack number #92 in "Perl Hacks" book where I first read about Contextual::Return.

AUTHOR

Jozef Kutej

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.