in reply to Memory usage breakup

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".