Interesting. FWIW, on Windows 7 (monitoring with Task Manager) and running Strawberry 5.14.2.1, the program below will release (very) roughly half of the allocated memory when the undef $s is done. If the undef statement is changed to $s = ''; nothing is deallocated.
Half?!? What this means I do not know. (But see Update2 below.)
>perl -wMstrict -le
"my $s = '.' x 500_000_000;
sleep 5;
undef $s;
sleep 10;
"
Update: Same results with Strawberry 5.10.1.5.
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, for a total of 1G. 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.
|