Subject: | Memory leak with anonymous classes, attributes and method signatures. |
Not sure if this is considered abuse of this module, if it is I
wouldn't mind being pointed in the right direction, but I'm trying to
write a plugin system where I can load and unload dynamically, so new
code can be loaded without restarting the whole system. Each plugin
being defined by an anonymous class.
However, when I use MooseX::Declare to create these anonymous classes
there is a leak of about 40k per instance, and every attribute, method
or method modifier adds a bit more to the leak. Declaring methods with
a plain sub doesn't seem to contribute anything to the leak, only when
using method signatures.
Running leaktest.pl, which runs the leak.pl "plugin" 1000 times, the
memory usage starts at around 20MB resident and ends somewhere just
below 90 MB.
Using Devel::Cycle there seems to be a few cycles for each method being
added using method signatures. Attributes makes it bail out, so not
sure there.
When changing it to use noleak, which creates a plain anonymous class
using Moose::Meta:Class, the resident memory stays at a stable 6MB.
The leak is not massive, but it adds up over time, on my test machine I
can live with it, in production there will be fewer code reloads, but
it adds up over time.
Subject: | leaktest.pl |
#!/usr/bin/perl
use feature ':5.10';
use strict;
use warnings;
for (1..1000) {
my $c = do "leak.pl";
}
say "done";
sleep 10;
say "bye";
Subject: | noleak.pl |
#!/usr/bin/perl
use feature ':5.10';
use strict;
use warnings;
use Moose::Meta::Class;
my $class = Moose::Meta::Class->create_anon_class();
my $p = Class::MOP::Package->initialize($class->name);
$p->add_method(execute => sub {
my ($c,$d) = @_;
say "hello";
});
$class;
Subject: | leak.pl |
#!/usr/bin/perl
use feature ':5.10';
use strict;
use warnings;
use MooseX::Declare;
class {
method execute ($c,$d) {
say "hello $c & $d";
}
};