http://qs321.pair.com?node_id=691091


in reply to Oh where has my memory gone?

Well, the first answer is a good one. Let me explain it a bit. You have this code inside manager():

sleep(2); &manager();

Every time a subroutine calls another subroutine, the stack grows. Each subroutine in the chain hangs onto whatever memory it has. When your stack gets big enough, you'll run out of memory or blow the stack -- both are fatal.

As an aside, you should really include use strict; use warnings; in your code -- you would have got a warning about deep recursion inside manager() long before you ran out of memory.

If you want to avoid this, you have two options: refactor your code so that manager() is just a loop, or use goto.

If you say goto &manager;, you're effectively1 making a jump, not a call -- your stack remains constant.

Also, you should read perlvar, specifically the bits on my - variables that you only need inside of manager should be declared with that scope using my

  1. As shmem explains below, it's not really implemented as a jump; however, the effect is so similar that the difference is unimportant for this convsersation. Still -- thanks to shmem for the clarification.

Updates:

<radiant.matrix>
Ramblings and references
“A positive attitude may not solve all your problems, but it will annoy enough people to make it worth the effort.” — Herm Albright
I haven't found a problem yet that can't be solved by a well-placed trebuchet

Replies are listed 'Best First'.
Re^2: Oh where has my memory gone?
by shmem (Chancellor) on Jun 09, 2008 at 21:02 UTC
    If you say goto &manager;, you're making a jump, not a call -- your stack remains constant.

    Not quite accurate; it's not a jump: a new stack frame is set up, the current stack frame is replaced by the new one, then unwound, so you have two of the same size. The memory used might remain constant, though. </nitpick>

    ;-)

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
      Its still doing it, slowly but surely this script eats all the RAM available! 0.5, 0.9, 1.4, 25... Dead! Is there a better way of writing this? It seems simple enough, but eventually the script will end with the out of memory error.
        Sorry for that... Although perl was eating a ton of memory, it ended up being other processes as well. Thank god for SWAP!
Re^2: Oh where has my memory gone?
by Anonymous Monk on Jun 09, 2008 at 20:51 UTC
    Ahhh, I completely forgot about that. That I was simply creating multiple copies of manager (which I was). Thank you very very much, it should solve my memory issue. ;)