我在运行一个perl脚本时遇到了一些内存泄漏问题,因为perl占用的内存量不断增加。因此,我正在尝试使用Devel::Leak来追踪泄漏。我发现每当我调用DBI的prepare
方法时,Devel::Leak
返回的标量值数量就会增加一个。下面是我编写的测试脚本:
#!/usr/bin/perl
use strict;
use Devel::Leak;
use DBI;
START:
my $handle; # apparently this doesn't need to be anything at all
my $leaveCount = 0;
my $enterCount = Devel::Leak::NoteSV($handle);
print "ENTER: $enterCount SVs\n";
{
# CONFIG VARIABLES
my $platform = "mysql";
my $database = "db";
my $host = "localhost";
my $port = "3306";
my $user = "user";
my $pw = "pass";
#DATA SOURCE NAME
my $dsn = "dbi:mysql:$database:$host:3306";
# PERL DBI CONNECT
my $dbh = DBI->connect($dsn, $user, $pw);
$dbh->prepare("SELECT * FROM table"); # The script seems to gain one SV without this
# line here, but since this is my issue in my
# main script I decided to leave it in
# undef $dbh; I tried undef-ing this, but it made no difference
}
$leaveCount = Devel::Leak::CheckSV($handle);
print "\nLEAVE: $leaveCount SVs\n";
sleep(1);
goto START;
这里我做错了什么,还是DBI模块存在内存泄漏?另外,我知道每次循环添加一个SV并不是一个大问题,而且我可能在其他地方有更大的内存泄漏,导致perl占用服务器的内存如此之多。然而,如果可能的话,我仍然想修复它。程序员的好奇心 :)
更新:第一次似乎会添加约3,000个SV,然后每次都会增加1个。