Slash Boxes
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

jplindstrom (594)

  (email not shown publicly)

Journal of jplindstrom (594)

Wednesday October 16, 2002
06:36 PM

Survival tip #39

[ #8416 ]

I emphatically did not know this.

Jan Dubois says:
"If you ever use a 10MB string in a scalar variable, the hidden string buffer for this ariable will stay allocated, even if you just assign a new short string to it. This is even true for lexical variables after their scope has closed"

This affects at least two programs that I know of off the top of my head.

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
More | Login | Reply
Loading... please wait.
  • You can see this in action by looking at the size of the scalar with the Devel::Size module. You can see similar things with arrays when you shrink them down.
  • And, of course, even if all memory for that string is deallocated, Perl hangs on to it and never gives it back to the OS. This is a common question on mod_perl lists: "My Apache children just keep on eating memory!"


    • Yeah, but that's something else, that deallocated memory doesn't go back to the OS.

      In this case it doesn't even go back to Perl, and that's a little worrisome if you occasionally get a peak of huge indata.

      To me that doesn't matter _that_ much since I tend to avoid long running processes, restarting the program every once in awhile. Even if Perl behaves and you code your stuff the right way, there is always some module that will mess up and not break a circular reference, or some external lib will forget t
    • What is this rampant fallacy of applications giving memory back to the OS? That is completely dependent on the implementation of the malloc, and in many systems the (virtual) memory use never goes down, only up. I think glibc malloc does memory allocation using mmap(), and the munmap() by free() does make the process virtual memory use go down. But nevertheless, expecting free() (or at Perl level, undef()) to make one's memory use (as shown by, say, ps), is a false assumption. Completely explaining it re