in reply to Re^4: Memory management with long running scripts
in thread Memory management with long running scripts

Update2: Actually, I think I understand a little of what is going on. From the Task Manager memory stats, when the '.' x 500_000_000 expression of the my $s = '.' x 500_000_000; statement executes, it consumes about 500M to build the string. The string is then copied to the $s scalar, thus consuming another 500M. it appears the first 500M (used to build the string) is never deallocated. Only the memory consumed by the $s scalar is deallocated when it is undef-ed.

You have a 500MB constant folded string sitting in RAM created by the Perl Compiler/Parser. It stays around in the function's PAD aslong as the function's opcodes stay around (usually entire runtime). Undef guarantees it will free the string buffer in the scalar. "$scalar = undef();" is not the same as "undef($scalar);", "= '';" just truncates SvCUR to 0. If you want "= ''" to free the string buffer, bring it in to Perl RT and up with p5p. I think perhaps over a certain cutoff (low MBs) assigning empty string or undef, should trigger a free, similar to what undef($scalar) does.
  • Comment on Re^5: Memory management with long running scripts

Replies are listed 'Best First'.
Re^6: Memory management with long running scripts
by AnomalousMonk (Archbishop) on Jul 22, 2012 at 01:33 UTC

    Is there any way to persuade Perl to release its death-grip on the memory used by  '.' x 500_000_000 to build the string in the first place?