【发布时间】:2011-05-06 16:10:00
【问题描述】:
我使用 Log4perl 作为包的一部分来捕获特定 DBI 连接正在做什么。我目前的计划是通过Log::Log4perl->get_logger($mysql_connect_id) 为每个连接创建一个新的记录器对象,这应该允许各种连接写入不同的文件或同一个文件,而不会互相搞砸。
我担心的是当连接断开并且不再需要该记录器时会发生什么。如果 Log4perl 只是无限期地保留这些记录器,这听起来像是内存泄漏的秘诀。
在我确定记录器不再有用后,最好的方法是什么?或者,相反,这甚至是一个问题——Log4perl 是否有某种内置的处理机制已经可以防止这种泄漏?
编辑: 在问题的 cmets 中提到,这里可能值得一提:Log::Log4perl::Logger 有一个看起来很有希望的
DESTROY 方法。但是,它没有记录,并引发了一堆“在字符串 eq 中使用未初始化值”的警告,这让我很警惕;感觉就像一个黑客。 (但如果这是最好/唯一的方法,我想问题变成“如何关闭来自特定包的特定警告?”)
【问题讨论】:
-
DESTROY方法不应该被手动调用,因为当要从内存中删除对象时,它会被 perl 本身调用。直接调用DESTROY不会释放内存。 -
@Ivan:好吧,废话。非常漂亮的 hack 就这么多。感谢您的提示。
-
Logger 对象是代码引用的小散列。除非您正在制作大量的东西,否则我认为与您的程序存储在内存中的任何实际数据相比,额外的内存是无关紧要的。别担心。