我想我在 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。如果是泄漏,我怎么知道这是否在以后的版本中得到纠正?
- 如果尚未更正,向核心团队报告最简单的方法是什么?
谢谢!哈维。