【问题标题】:Symfony 2 Doctrine memory usageSymfony 2 Doctrine 内存使用情况
【发布时间】: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 stackoverflow.com/a/10913115/842075 有关

标签: php memory symfony doctrine


【解决方案1】:

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

$em->clear(); 

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

【讨论】:

  • 这样,内存减少到 66 mb (mem 4)。
  • 额外的内存是 $r 变量的结果。 unset() 不保证立即进行垃圾收集,因此进程将保留该内存,直到垃圾收集器释放它或进程终止。请参阅stackoverflow.com/questions/584960/… 了解更多详情。
猜你喜欢
  • 2011-02-27
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多