Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Mini-Tutorial: Perl's Memory Management

by Jenda (Abbot)
on Oct 27, 2009 at 22:46 UTC ( #803538=note: print w/ replies, xml ) Need Help??


in reply to Mini-Tutorial: Perl's Memory Management

I'm not sure what is the intended audience of this article and the expected previous knowledge. As it is, it probably confuses more people than it helps.

The fact that a variable (or rather the allocated structure) is not freed, but rather cleared and placed in some list of preallocated structures, is an implementation detail. A transparent optimization that 99.9% of people should not even know about. What they do need to know and be sure of is that the data will not be lost if there is a reference and that the memory will not be lost if there is no reference. Whether the part of memory goes to the general hash or some other place is not really their business.

IMnsHO, there should be a big note on top that says something like "This is only for the curious, only for those that want to know what happens behind the scenes and is supposed to be hidden to the audience".

and to tell the truth I don't understand what are you trying to say in the "undef does not free a variable" section.

Jenda
Enoch was right!
Enjoy the last years of Rome.


Comment on Re: Mini-Tutorial: Perl's Memory Management
Re^2: Mini-Tutorial: Perl's Memory Management
by ikegami (Pope) on Oct 27, 2009 at 23:09 UTC

    The fact that a variable (or rather the allocated structure) is not freed, but rather cleared and placed in some list of preallocated structures, is an implementation detail.

    I said as much. ("This is an optimisation that should be transparent to you.")

    Misconceptions about the implementation details come up all the time. You've provided me with the perfect example in this paragraph. You believe it describes Perl when it doesn't.

    Where'd you get a list of preallocated structures from? Placing blocks of memory on a list for future use is how freeing a variable usually works. This is exactly what Perl doesn't do.

    I don't understand what are you trying to say in the "undef does not free a variable" section.

    The quote line contradicts what seems to be a popular belief. The section describes what undef actually does (frees the buffers associated with the variable).

      I said as much. ("This is an optimisation that should be transparent to you.")

      That is very obtuse way

        I think it was much less obtuse, it says a lot more and it's much clearer than "it's an implementation detail except when it matters".

      "should" sounds a bit dangerous to me. "Should be transparent" ... or so it's not always? It can fail? Or what? How? The "should" seems to cause uncertainty.

      Mkay, let's see. If we declare the variable in a loop, we are about to do another iteration and there are no other references to the data, perl may clear the contents, but leave the structure (can't remember the name) and it doesn't have to allocate memory for that variable for the next iteration. Nice. Efficient. Now what does it do if it's not in any loop? Or it was the last iteration? What if it's a my variable inside a string eval""?

      I believe your tutorial will only make sense if you first explain at least a bit about how are the data stored (the variable name points to a SV which points to the string/contains the number/whatever) and then you can go on explaining what's "cleared" or "freed" and what does the Devel::Peek::Dump mean.

      Anyway for almost everyone the whole memory allocation tutorial should be "Declare variables with my in the tightest scope possible. Make sure you either do not create circular references, use weaken() to make sure at least one link in each circle is weak or break the circle by reseting at least one reference to undef. Do not expect perl to return the memory to the OS, but that doesn't mean the memory is not freed and will not be reused, it's just kept in perl's own hands. The rest is not your business."

      Jenda
      Enoch was right!
      Enjoy the last years of Rome.

Re^2: Mini-Tutorial: Perl's Memory Management
by jethro (Monsignor) on Oct 28, 2009 at 10:43 UTC

    There are a lot of long-running perl scripts especially in the CGI area that depend on not using up more and more memory. But generally you have to do really dirty things to get bit by this. So the information is useful although probably not FAQ-worthy, especially not in this detail. And I had problems with understanding it on first reading too

    The most useful information in my opinion is "There is no guarantee that your perl version will give back memory to the system"

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://803538]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (7)
As of 2014-07-12 11:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (239 votes), past polls