http://www.perlmonks.org?node_id=182355


in reply to Does undef free ram?

Here is a little script for linux only that can help to understand what happens to memory:

our @test; print "nothing : Size = ".size()."\n"; push @test, rand for (1..100000); print "push : Size = ".size()."\n"; #undef @test; @test = (); print "deleted : Size = ".size()."\n"; sub size { open DATA, "< /proc/$$/status" or die "Unable to read data : $!\n"; local $/; <DATA> =~ m/^VmSize:\s+(.*?)$/m; return $1; }

If I use @test = ();, output is
nothing : Size = 2988 kB push : Size = 5492 kB deleted : Size = 5492 kB

and with undef @test;
nothing : Size = 2988 kB push : Size = 5488 kB deleted : Size = 4976 kB

Of course, this example is OS dependant. But you can notice that the first solution does not free any OS memory at all. As FatVamp said, Perl can then reuse the memory. It can be noticed that a few more memory is freed when using undef, but not all that was used.

HTH

--
zejames

Replies are listed 'Best First'.
Re: Re: Does undef free ram?
by dada (Chaplain) on Jul 18, 2002 at 10:26 UTC
    and here's the same script under Win32 (NT 4.0/2000/XP):
    use Win32::API 0.20; my $GCP = new Win32::API( "kernel32", "GetCurrentProcess", "", "N" ) or die "Can't import API: $^E"; my $GPMI = new Win32::API( "psapi", "GetProcessMemoryInfo", "NPN", "N" ) or die "Can't import API: $^E"; our @test; print "nothing : Size = ".size()."\n"; push @test, rand for (1..100000); print "push : Size = ".size()."\n"; #undef @test; @test = (); print "deleted : Size = ".size()."\n"; sub size { my $handle = $GCP->Call(); my $m = pack("LLLLLLLLLL", 16*10, 0 x 10); $r = $GPMI->Call( $handle, $m, 160 ); my $pwss = (unpack("LLLLLLLLLL", $m))[2]; return int($pwss/1024)." kB"; }
    interestingly enough, the figures are different here: if I use @test = ();, output is:
    nothing : Size = 2252 kB push : Size = 4776 kB deleted : Size = 4776 kB
    and with undef @test;
    nothing : Size = 2252 kB push : Size = 4776 kB deleted : Size = 4776 kB
    both solutions don't free any memory at all.

    cheers,
    Aldo

    __END__ $_=q,just perl,,s, , another ,,s,$, hacker,,print;