Adrien wrote:
> I have a "big" problem with threads and shared memory.
>
> Example :
> #!/usr/bin/perl
>
> use threads;
> use threads::shared;
>
> my $char_test : shared;
> $char_test = "A";
>
> for (my $i = 0; $i < 25; $i++)
> {
> $char_test .= $char_test;
> }
>
> print "done\n";
>
> sleep 5;
>
> print "undef\n";
> undef($char_test);
> print "undef done\n";
>
> sleep 60;
>
> If I comment "use threads;", all is ok (memory usage is about 3.5% and
> after undef, about 0.1%). But, if I uncomment "use threads;", memory usage
> of perl is double (7%) and after undef, memory usage is 3.5%...
> You can see that with "ps auxw".
>
> It's a big problem for my project. Somebody knows this problem?
First of all, you didn't tell us which versions of Perl, 'threads' and
'threads::shared' you're using.
Barring that, I do not see a definite indication of a memory leak. Perl
uses its own memory management scheme, holding onto memory from the OS
for its own purposes. 'undef'ing a Perl variable does not mean that
the memory it used is returned to the OS - Perl may hang onto it for
later reuse.
To see if there is a 'real' memory leak, you need to run your string
building test inside a loop several times to see if memory usage keeps
going up with each interation, as so:
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
use threads;
use threads::shared;
my $char_test :shared;
for (1..5) {
$char_test = 'A';
for (1..25) {
$char_test .= $char_test;
}
print("Check memory\n");
sleep(5);
undef($char_test);
}
print("Check memory - final\n");
sleep(5);
print("Done\n");
When I run this, I see that memory usage is constant and not continually
increasing with each loop. Therefore, as far as I can tell, there is no
memory leak.