Symfony 2 Doctrine 内存使用情况

Posted

技术标签:

【中文标题】Symfony 2 Doctrine 内存使用情况【英文标题】:Symfony 2 Doctrine memory usage 【发布时间】:2013-03-06 11:56:11 【问题描述】:

我正在使用实体存储库创建查询,它似乎存在内存泄漏。

在我的实体存储库类中:

echo 'mem 1 : ' . (memory_get_usage()/1024/1024) . "<br />\n";
$query = $this->createQueryBuilder('a')->select('a','b','c','...');
echo 'mem 2 : ' . (memory_get_usage()/1024/1024) . "<br />\n";
$r = $query->getQuery()->getResult();
echo 'mem 3 : ' . (memory_get_usage()/1024/1024) . "<br />\n";
$this->clear(true);
$query->getQuery()->free(true);
unset($r);
echo 'mem 4 : ' . (memory_get_usage()/1024/1024) . "<br />\n";

输出:

内存 1:5.0805282592773 内存 2:5.0998611450195 内存 3:91.49528503418 内存 4:77.939567565918

为什么释放内存后内存没有恢复到初始大小(5 MB)?

而且只能从 91 传到 77。

【问题讨论】:

如果你也调用 unset($query) 怎么办? 刚刚在另一个 unset 旁边添加了 unset($query) :$this->clear(true); $query->getQuery()->free(true);未设置($查询);未设置($r);但它是一样的:mem 4:77.849983215332 结果如何? 相同:mem 4:77.849983215332 我认为这与在调试模式下启用 sqllogger ***.com/a/10913115/842075 有关 【参考方案1】:

Doctrine 缓存它已加载的实体的某些方面。使用

$em->clear(); 

从当前实体管理器中分离所有对象。

【讨论】:

这样,内存减少到 66 mb (mem 4)。 额外的内存是 $r 变量的结果。 unset() 不保证立即进行垃圾收集,因此进程将保留该内存,直到垃圾收集器释放它或进程终止。请参阅***.com/questions/584960/… 了解更多详情。

以上是关于Symfony 2 Doctrine 内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony2 中使用 Doctrine 映射异常错误

Symfony2/Doctrine 提交表单需要很长时间

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

Doctrine 2,Symfony 2 中的独特约束

Symfony 2 Doctrine 导出到 JSON

如何在没有Symfony 4中的DoctrineBundle的情况下将DBAL Doctrine连接注册为服务