[Vienna-pm] Garbage-Collection

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Thu Aug 11 04:34:10 PDT 2005


On 2005-08-11 11:24:18 +0100, Patrick Meidl wrote:
> On Wed, Aug 10 2005, Peter J. Holzer <hjp-vienna-pm-list at hjp.at> wrote:
> 
> > Das widerspricht aber dem, was ich glaubte, über den
> > Perl-Garbage-Collector zu wissen.
> > 
> > Ich dachte, das würde einfach nur Reference-Counts verwalten und jedes
> > Objekt sofort freigeben, wenn der Reference-Count auf 0 fällt.
> 
> das ist richtig. ein gotcha, ueber das ich einmal gestolpert bin, ist,
> dass der perl garbage collector einmal allozierten speicher erst beim
> beenden des scripts wieder ans system zurueckgibt (er kann aber intern
> fuer andere daten verwendet werden). wenn du also deine riesige data
> structure loescht, ist der memory footprint des scripts nachher immer
> noch derselbe.

Ja, das ist das traditionelle Verhalten von Unix-malloc. Die glibc hat
allerdings ein anderes Verhalten: Große Memory-Blöcke (über 128 kB,
IIRC) werden sofort ans OS zurückgegeben, kleine werden "recycelt" und
nur zurückgegeben, wenn es sich auszahlt. Perl bringt noch eine eigene
Malloc-Implementation mit, die man optional verwenden kann -
möglicherweise verhält sich die so wie das Unix-malloc.

Bei den beiden perl-Builds, die ich für die Tests verwendet habe ist
allerdings laut "perl -V" usemymalloc=n - somit sollte da eigentlich das
glibc-Verhalten zum Vorschein kommen. Konnte ich in diesem Fall nicht
beobachten, aber da das sehr von der Reihenfolge der Allokationen und
Deallokationen abhängt, wundert mich das nicht.


Noch eine kleine Beobachtung:

Folgendes Progrämmchen braucht konstant 26 MB RAM:

---8<------8<------8<------8<------8<------8<------8<------8<------8<---
#!/usr/bin/perl
use warnings;
use strict;

my $s;

for ('A' .. 'Z') {
    $s = $_ x 10_000_000;
    print "$_\n";
    sleep 10;
    $s = "x";
    print "x\n";
    sleep 10;
}
--->8------>8------>8------>8------>8------>8------>8------>8------>8---

Wenn man die Schleife aber entrollt:

--->8------>8------>8------>8------>8------>8------>8------>8------>8---
#!/usr/bin/perl
use warnings;
use strict;

my $s;

    # A
    $s = "A" x 10_000_000;
    print "A\n";
    sleep 10;
    $s = "x";
    print "x\n";
    sleep 10;
    # B
    $s = "B" x 10_000_000;
    print "B\n";
    sleep 10;
    $s = "x";
    print "x\n";
    sleep 10;
    # C
    [...]
--->8------>8------>8------>8------>8------>8------>8------>8------>8---

Dann steigt der Speicherverbrauch mit jeder Zuweisung eines "großen"
Strings um 10 MB an.

(perl 5.8.3 und 5.8.6 auf Linux)

	hp

-- 
   _  | Peter J. Holzer    | Ich sehe nun ein, dass Computer wenig
|_|_) | Sysadmin WSR       | geeignet sind, um sich was zu merken.
| |   | hjp at hjp.at         |
__/   | http://www.hjp.at/ |	-- Holger Lembke in dan-am
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20050811/d9d2f160/attachment.bin


More information about the Vienna-pm mailing list