2013-03-06 10 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

+0

unset ($ query)을 다른 unset 옆에 추가했습니다 : $ this-> clear (true); $ query-> getQuery() -> 무료 (true); unset ($ query); unset ($ r); 하지만 동일합니다. mem 4 : 77.849983215332 – Seb33300

+0

그리고 결과는 무엇입니까? – sroes

답변

3

Doctrine은로드 한 엔티티의 특정 측면을 캐시합니다.

$em->clear(); 

을 사용하면 현재 개체 관리자에서 모든 개체를 분리 할 수 ​​있습니다.

+0

이렇게하면 메모리가 66MB (mem 4)로 줄어 듭니다. . – Seb33300

+1

추가 메모리는 $ r 변수의 결과입니다. unset()은 즉시 가비지 콜렉션을 보장하지 않으므로 가비지 컬렉터가 프로세스를 해제하거나 프로세스가 종료 될 때까지 프로세스가 해당 메모리를 보유합니다. 자세한 내용은 http://stackoverflow.com/questions/584960/whats-better-at-freeing-memory-with-php-unset-or-var-null을 참조하십시오. –

관련 문제