如何解决类中匿名函数的内存泄漏?
这是我的代码:
class a
{
public function __construct()
{
$this->test = function() {};
}
public function __destruct()
{
echo "called\n";
}
}
while (true) {
$a = new a;
$new = memory_get_usage();
if (isset($old)) {
echo ($new - $old) . "\n";
}
$old = $new;
}
每次循环运行时使用该代码会额外消耗 736 字节的内存。原因是对象的析构函数从未被调用。
如果我用 $a = new a;
替换 $a = function() {};
,那么每个循环广告都不会消耗额外的内存,每次都会调用构造函数。
如果我用 $this->test = function() {};
替换 $this->test = WeakReference::create(function() {});
似乎可以解决问题,但是我必须重写所有代码来执行 $this->test->get()(...)
而不是 ($this->test)('...')
或一些这样的。
是否有另一种方法可以堵住这种内存泄漏,并且比 WeakReferences 需要更少的重写?
解决方法
在结束循环之前尝试 gc_collect_cycles();
。
当你有普通引用时,你就是在创建一个循环引用,因为对象有一个对函数的引用,而函数是一个引用对象作用域的闭包。循环引用是基于引用计数的垃圾回收的一个问题,因此在重新分配变量时不会立即回收内存。
对象和函数将被完全垃圾收集器定期回收。您可以通过调用 gc_collect_cycles()
来强制执行此操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。