1

我想我在 WebTestCase 类或内核本身中发现了内存泄漏。我的问题在最后。

为了重现,我创建了一个新的空 WebTestCase,它执行 $max 断言(在我的测试中,$max 的范围从 1 到 100.000)而不实例化任何内核。

<?php
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class DemoTest extends WebTestCase
{
    public function testHello(  )
    {
        $max = 100000;
        for( $i = 0; $i < 1; $i++ )
        {
            $this->assertTrue( true );
        }
    }
}

$max=1

Time: 0 seconds, Memory: 5.75Mb
OK (1 test, 1 assertion)

$max=100000

Time: 1 second, Memory: 5.75Mb
OK (1 test, 100000 assertions)

正如预期的那样,无论是运行 1 次还是 100.000 次,我都会消耗相同的内存。

现在我尝试循环创建任意类,使用它并销毁它。我选择 DOMDocument 的方式与选择任何其他类的方式相同。

    public function testHello(  )
    {
        $max = 100000;
        for( $i = 0; $i < $max; $i++ )
        {
            $dummy = new \DOMDocument();
            $dummy->loadHTML( '<html><head><title>dummy</title></head><body>dummy</body></html>' );
            unset( $dummy );
            $this->assertTrue( true );
        }
    }

$max=1

Time: 0 seconds, Memory: 5.75Mb
OK (1 test, 1 assertion)

$max=100000

Time: 2 seconds, Memory: 5.75Mb
OK (1 test, 100000 assertions)

同样,无论我执行 1 次还是 100.000 次,我都会消耗相同的内存。

但是...现在我在循环中创建和销毁内核。我既不做 ->boot() 也不做 ->shutdown(),只是获取新的内核对象,这些对象甚至没有被引导,然后被取消引用,因此它们应该在释放所有资源时死掉。

    public function testHello(  )
    {
        $max = 10000;
        for( $i = 0; $i < $max; $i++ )
        {
            $dummy = static::createKernel();
            unset( $dummy );
            $this->assertTrue( true );
        }
    }

$max=1

Time: 0 seconds, Memory: 6.25Mb
OK (1 test, 1 assertion)

$max=100000

Time: 9 seconds, Memory: 165.50Mb
OK (1 test, 100000 assertions)

从 5.75 提高到 6.25 是合乎逻辑的,这可能是内核资源的大小。半兆。但不正确的是,通过创建 100.000 个内核而不对其进行任何操作,我们往往会消耗 165 兆。有人正在释放它分配的资源。

我的问题:

  • 这是泄漏吗?或者这是预期的行为,出于任何额外的原因,我不明白为什么要这样做?
  • 我使用 2.0.10。如果是泄漏,我怎么知道这是否在以后的版本中得到纠正?
  • 如果尚未更正,向核心团队报告最简单的方法是什么?

谢谢!哈维。

4

1 回答 1

2

Symfony2 代码托管在 github.com 上,问题必须在此站点上声明https://github.com/symfony/symfony/issues

我在繁重的 web 测试用例中也遇到过这种问题,并且在 2.0.x 版本中没有修复。我无法确保您这是内存泄漏或正常行为...

我建议您使用 Google Groups 邮件列表,然后是 GitHub 问题。

于 2012-05-07T10:24:10.563 回答