On Jun 30, 2010, at 6:52 PM, Craig A. Berry wrote:

> 
> On Jun 28, 2010, at 4:32 PM, Mark Berryman wrote:
> 
>> Sometime between Perl 5.8.6 and 5.12.1 a memory leak was introduced into 
>> Perl and it appears to be in the glob function.  The following should 
>> reproduce the problem on any VMS system:
>> 
>> @dirs = glob('SYS$COMMON:[000000]*.DIR');
>> 
>> for (;;) {
>> foreach (@dirs) {
>>   s|\[000000\]|\[|;
>>   $_ = substr($_, 0, rindex(uc($_), '.DIR')) . ']';
>>   @files = glob($_ . '*.*;*');
>> }
>> }
>> 
>> Execute this and then repeatedly hit control-T to watch your memory 
>> consumption climbing.  Let it run long enough and it will eventually abort 
>> due to insufficient virtual memory.
>> 
> 
> I can confirm that it chews memory pretty fast (about 4,000 pages every 5 
> seconds on my rx2600).  There is a Perl_vms_start_glob() function in 
> [.vms]vms.c if anyone is hankering after a session with the heap analyzer and 
> wants to know where to look.  I hope to look into this at some point but 
> can't commit to when.
> 

I found it.

In VMS.C, the routine Perl_flex_stat_int allocates memory twice without ever 
releasing it.  Here are the two instances:
    fileified = PerlMem_malloc(VMS_MAXRSS);
    temp_fspec = PerlMem_malloc(VMS_MAXRSS);

Simply adding the appropriate calls to PerlMem_free at the exit point seems to 
have fixed the problem.

Reply via email to