2011-11-20 2 views
1

내 코드에 foreach 문이 있는데, 각 반복마다 막대한 양의 데이터가 계산되고 다음 반복으로 넘어갑니다. 이 코드를 실행하지만 로그를 읽을 때 메모리 누수 오류가 있음을 알 수 있습니다.왜 코드에서 가비지 수집이 활성화되어 있지 않습니까?

PHP.net에서는 이런 일이 발생하면 gc_enabled()을 사용하는 것이 좋습니다.

은 내가 foreach 블록의 마지막 줄에이 라인을 추가했습니다 :

echo "Check GC enabled : " . gc_enabled(); 
echo "Number of affected cycles : " . gc_collect_cycles(); 

을 그리고 이것은 출력 :

Check GC enabled : 1 
Number of affected cycles : 0 

왜 사이클이 존재하지만, 영향을받는주기는 0?

답변

3

"메모리 누수 오류"가 표시되지 않을 가능성이 있습니다. 당신이 보았던 것은 아마 허용 된 메모리 소모 오류입니다. 즉, 스크립트가 php.ini에 정의 된 허용 된 최대 메모리 제한을 초과했음을 의미합니다. 제한을 변경하려면 core php.ini directives의 매뉴얼 페이지를보십시오. memory_limit리소스 제한 아래에 있습니다.

gc_collect_cycles()의 경우 기능은 여전히 ​​undocumented이며 사용하지 않는 것이 좋습니다. 읽은 내용은 아마도 theory behind collecting cycles in PHP 일 것입니다. 함수가보고하는 것은 사이클을 수집하지 않았기 때문에 처음에는 메모리 누수 오류 메시지가 없음을 의미합니다.

제대로 문서화되고 관련 기본 사항을 이해할 때까지 PHP에서 가비지 수집을 피하는 것이 좋습니다.

+0

감사합니다. 알았다. 여전히 오류가 있습니다. 나는 나의 긴 계산을 일부분 축소해야한다고 생각한다! – Netmoon

+1

"주기가 수집되지 않았으므로 첫 번째 장소에서 메모리 누출이 없음을 의미합니다."실제로 그런 의미는 아닙니다. 관리 환경에서는 더 이상 실제로 사용하지 않을 때 개체를 유지하면 메모리 누수가 발생합니다. 1,000,000 개의 GC 콜렉션도 이러한 변수를 지우지는 못합니다. 그래서 그들은 누수 *입니다. 수집은 사용되지 않는 변수를 확인하고 이전에 점유 한 메모리 슬롯을 비 웁니다. –

+0

@ YamMarcovic 맞아요.하지만 대답은 질문의 맥락에서입니다. 나는 그 문장을 바꾸었다. – user39596

관련 문제