TOKUHIROM MEMO

 | 

2008-07-29

XML::Atomメモリリークしてるっぽい 01:22

下記のコードで再現。

use strict;
use warnings;
use GTop;
use XML::Atom;
use XML::LibXML;

print "XML::Feed: $XML::Feed::VERSION\n";
print "XML::Atom: $XML::Atom::VERSION\n";
print "XML::LibXML: $XML::LibXML::VERSION\n";
print "XML::LibXML::LIBXML_DOTTED_VERSION: " . XML::LibXML::LIBXML_DOTTED_VERSION, "\n";

my $gtop = GTop->new;
warn "START LOOP";
my $m1 = $gtop->proc_mem($$)->size;
my $af = XML::Atom::Feed->new;
while (1) {
    for my $i ( 0 .. 100 ) {
        for (0..1000) {
            $af->set($af->ns, 'title' => "YAY" x 1000);
        }

        my $m2 = $gtop->proc_mem($$)->size;
        warn "$m1, $m2 = @{[ $m2-$m1 ]}" unless $m1 == $m2;
    }
    # warn ".";
}

環境は以下のとおり。

XML::Feed: 0.12
XML::Atom: 0.28
XML::LibXML: 1.66
XML::LibXML::LIBXML_DOTTED_VERSION: 2.6.27

ちなみに、問題は XML::LibXML にありそう。

use strict;
use warnings;
use GTop;
use XML::LibXML;

print "XML::LibXML: $XML::LibXML::VERSION\n";
print "XML::LibXML::LIBXML_DOTTED_VERSION: " . XML::LibXML::LIBXML_DOTTED_VERSION, "\n";

my $gtop = GTop->new;
warn "START LOOP";
my $m1 = $gtop->proc_mem($$)->size;
my $doc = XML::LibXML::Document->new('1.0', 'utf8');
my $ns = 'http://purl.org/atom/ns#';
while (1) {
    for my $i ( 0 .. 100 ) {
        for (0..1000) {
            my $title = $doc->createElement('title');
            $title->getChildrenByTagNameNS($ns, 'title');
        }

        my $m2 = $gtop->proc_mem($$)->size;
        warn "$m1, $m2 = @{[ $m2-$m1 ]}" unless $m1 == $m2;
    }
    # warn ".";
}

で、debian etch. perl 5.8.8

 |