2012-12-16 4 views
3

나는 PHP 메모리 관리를 공부하고 몇 가지 코드 샘플을 실행 중이다. 코드이 시나리오에서 PHP는 메모리 누출이 있습니까?

class Person 
{ 
    public function sayHello($who) 
    { 
      echo "Hello, $who!", "\n"; 
    } 
} 

echo "Start: ", memory_get_usage(), "\n"; 
$person = new Person(); 
echo "Person object: ", memory_get_usage(), "\n"; 
$person->sayHello("World"); 
echo "After call: ", memory_get_usage(), "\n"; 
unset($person); 
echo "After unset: ", memory_get_usage(), "\n"; 

의 출력은 :

Start: 122000 
Person object: 122096 
Hello, World! 
After call: 122096 
After unset: 122000 

예상. 객체를 할당 한 후에는 메모리가 커지지 만 메소드 호출이 끝나고 객체가 설정 해제 된 후에는 정상으로 돌아갑니다. 나는이 같은 코드를 수정하면 지금 :

class Person 
{ 
    public function sayHello($who) 
    { 
      echo "During call: ", memory_get_usage(), "\n"; 
      echo "Hello, $who!", "\n"; 
    } 
} 

echo "Start: ", memory_get_usage(), "\n"; 
$person = new Person(); 
echo "Person object: ", memory_get_usage(), "\n"; 
$person->sayHello("World"); 
echo "After call: ", memory_get_usage(), "\n"; 
unset($person); 
echo "After unset: ", memory_get_usage(), "\n"; 

를 내가 얻을 :

Start: 122268 
Person object: 122364 
During call: 122408 
Hello, World! 
After call: 122380 
After unset: 122284 

이유는 내가 사용하는 모든 메모리를 확보 할 수 없습니까? 내가 PHP 5.4을 사용하고 있습니다 : 메모리) (해제로 해제

PHP 5.4.9-4~oneiric+1 (cli) (built: Nov 30 2012 10:46:16) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans 
+0

Person 클래스의 객체를 설정 해제 한 후 다시 작성하면 PHP가 메모리를 재사용하는 방법을 볼 수 있습니다.) – meze

+0

동일한 테스트를 시도하고 memory_get_usage (true)를 추가하면 실제 사용 ... – matteosister

답변

3

,이 자동 memory_get_usage에 반영되지 않습니다(). 메모리는 사용되지 않고 다시 사용할 수 있습니다. 그러나 가비지 수집 루틴이 실제로 사용되지 않는 메모리가 실제로 사용되지 않는다는 점을 알게 된 후에야 비로소 가비지 수집 루틴이 시작됩니다.

+0

"that 사용되지 않는 메모리가 실제로 줄어 듭니다. "- 어딘가에는 힙을 줄이는 것이 조각화로 인해 쉽지 않으며 php는 스크립트가 종료 될 때까지 그렇게하지 않는다고 들었습니다. – meze

관련 문제