微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类中匿名函数的内存泄漏?

如何解决类中匿名函数的内存泄漏?

这是我的代码

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 举报,一经查实,本站将立刻删除。