Perl will free the memory used by SV when they are cleaned, folks!

I have worked a lot in that to make a function that clean a package from the memory, and it works! You can see the work at Safe::World, where each Safe::World compartment has it's own modules loaded, where I can clean one of this compartments and unload all the enverioment.

I know that it works because after 1000 times running the same script, cleanning the compartments I get 18Mb used by the process, and if I don't clean it I get 150Mb of use.

Actually Perl will recycle cleaned SV, so, when you create a SV you can't guarantee that it's adress wasn't used before. This I saw when I build the module Hash::NoRef, where the objective of this module is to store objects without mess with the DESTROY system, without increment the reference to this objects. A strange behavior in the 1st version was when we store an object and it's DESTROIED, than another object is created with a SV that has the same adress, what will puts the new object in the place of the old object that was cleaned, so, I will have an object stored in the table that I don't really have stored. But now this was fixed with weak references, and now everything is fine.

Don't forget that the memory management of Perl is one of the bests that exists!

If you want to know what is in the memory and how it's used, take a look in this funtion, it will scan from a package and tell the size of each stuff:

sub package_size_report { my $package = shift ; eval('require B::TerseSize') ; if ( $@ ) { return "You need to have installed B::TerseSize (from B: +:Size) to use &package_size!" ;} my $output ; $output .= "Memory Usage for package $package\n\n" ; my($subs, $opcount, $opsize) = B::TerseSize::package_size($package); $output .= "Totals: $opsize bytes | $opcount OPs\n\n" ; my($clen, $slen, $nlen); my @keys = map { $nlen = length > $nlen ? length : $nlen; $_; } ( sort { $subs->{$b}->{size} <=> $subs->{$a}->{size} +} keys %$subs ); $clen = length $subs->{$keys[0]}->{count} ; $slen = length $subs->{$keys[0]}->{size} ; for my $name (@keys) { my $stats = $subs->{$name}; if ($name =~ /^my /) { $output .= sprintf("%-${nlen}s %${slen}d bytes\n", $name, $stats +->{size}) ; } else { $output .= sprintf("%-${nlen}s %${slen}d bytes | %${clen}d OPs\n +", $name, $stats->{size}, $stats->{count} ) ; } } return $output ; }

Graciliano M. P.
"Creativity is the expression of the liberty".


In reply to Re: Memory usage breakup by gmpassos
in thread Memory usage breakup by eXile

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.