代码之家  ›  专栏  ›  技术社区  ›  neubert

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

  •  0
  • neubert  · 技术社区  · 4 年前

    这是我的密码:

    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;
    }
    

    如果我替换 $a = new a; 具有 $a = function() {};

    如果我替换 $this->test = function() {}; $this->test = WeakReference::create(function() {}); 这似乎解决了问题,但我必须重写我所有的代码来做 $this->test->get()(...) 而不仅仅是 ($this->test)('...') 或者类似的。

    有没有另一种方法可以堵住这个内存泄漏,比weakreference需要的重写更少?

    2 回复  |  直到 4 年前
        1
  •  1
  •   Barmar    4 年前

    当您有普通引用时,您正在创建一个循环引用,因为对象有一个对函数的引用,而函数是一个引用对象范围的闭包。循环引用是基于引用计数进行垃圾收集的问题,因此在重新分配变量时不会立即回收内存。

    对象和函数将由完整的垃圾收集器定期回收。你可以打电话来逼迫我 gc_collect_cycles() .

        2
  •  1
  •   Hisham    4 年前

    尝试 gc_collect_cycles(); 在结束循环之前。