2013-03-06 192 views
3

我正在用實體存儲庫創建一個查詢,它似乎有內存泄漏。Symfony 2 Doctrine內存使用情況

以我的實體儲存庫類:

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

Outpout:

MEM 1:5.0805282592773
MEM 2:5.0998611450195
MEM 3:91.49528503418
MEM 4:77.939567565918

釋放內存後,爲什麼內存不能恢復到初始大小(5MB)? 並且只能通過91到77.

+0

如果您還調用unset($ query)會怎麼樣? – sroes 2013-03-06 12:12:17

+0

剛添加未設置($查詢)旁邊的其他未設置: $ this-> clear(true); $ query-> getQuery() - > free(true); unset($ query); 未設置($ r); 但它是一樣的:mem 4:77.849983215332 – Seb33300 2013-03-06 12:27:23

+0

結果是什麼? – sroes 2013-03-06 12:29:00

回答

3

Doctrine緩存它已加載的實體的某些方面。使用

$em->clear(); 

從當前實體管理器中分離所有對象。

+0

有了這個,內存下降到66 MB(MEM 4) 。 – Seb33300 2013-03-07 09:31:00

+1

額外的內存是$ r變量的結果。 unset()不保證立即進行垃圾收集,因此進程將保留該內存,直到垃圾收集器釋放它或進程終止。有關更多詳細信息,請參閱http://stackoverflow.com/questions/584960/whats-better-at-freeing-memory-with-php-unset-or-var-null。 – 2013-03-07 14:41:00