2009-08-29 6 views

답변

15

this example from IBM과 같이 클래스를 할당하기 전후에 memory_get_usage()를 호출 할 수 있습니다. 아마도 복잡한 클래스 자체의 멤버 변수에 결과를 저장하는 래퍼를 만들 수도 있습니다.

편집 :

는이 같은 것을 할 수있는, 할당 된 메모리 크기를 저장에 대한 부분을 명확히하려면 : 미래의 어떤 시점에서

class MyBigClass 
{ 
    var $allocatedSize; 
    var $allMyOtherStuff; 
} 

function AllocateMyBigClass() 
{ 
    $before = memory_get_usage(); 
    $ret = new MyBigClass; 
    $after = memory_get_usage(); 
    $ret->allocatedSize = ($after - $before); 

    return $ret; 
} 

을, 당신은 얼마나 큰 볼 allocatedSize을 확인할 수 있습니다 그 물체는 배정 시점에있었습니다. 할당 한 후에 추가하면 할당 된 크기가 더 이상 정확하지 않게됩니다.

+1

PHP가 "잘못된 시간"에 할당 된 상태로 유지 된 메모리를 해제하기로 결정한 경우 어떻게해야합니까? PHP가 메모리를 해제 할 때 ("필요한 경우"라고 생각합니다) 실제로 알지 못합니다. 그러나이 해제가 일부 문제를 일으킬 수 있다고 생각합니까? 특히 순환 참조를 위해 PHP 5.3에서 도입 된 가비지 컬렉터는 무엇입니까? –

+0

그래,하지만 파스칼이 언급 한 것에 덧붙여, 할당 시간이 아닌 다른 시간에 이것을 찾을 수 있기를 바란다. 도로 아래로 여러 줄을 찾으려합니다. –

+0

@Pascal : PHP는 여전히 사용중인 객체에 의해 참조되는 메모리를 해제하지 않습니다. 순환 참조는 A 참조 B와 B 참조 A를 의미하지만 다른 것은 A 나 B를 참조하지 않습니다. 따라서 프로그램이 어떤 식 으로든 참조 할 수있는 한 메모리는 해제되지 않습니다. –

3

나는 이것이 가능하다고 생각하지 않는다. 나는 당신이 메모리에있는 물체의 크기를 얻을 수있는 것을 본 적이 없다.

꽤 근사한 아이디어를 얻는 해결책은 데이터를 직렬화하고 그걸 strlen을 사용하는 것일 수 있습니다 ... 그러나 그것은 실제로 추정치가 될 것입니다 ... 저는 다음과 같은 것에는별로 의지하지 않을 것입니다. 변수와 참조 카운트의 데이터 OUPUT을 있지만 메모리 사용 : 즉, 실제로 ...


심지어 debug_zval_dump은하지 않습니다

$obj = new stdClass(); 
$obj->a = 152; 
$obj->b = 'test'; 

echo '<pre>'; 
debug_zval_dump($obj); 
echo '</pre>'; 

는 당신을 얻을 것이다 :

object(stdClass)#1 (2) refcount(2){ 
    ["a"]=> 
    long(152) refcount(1) 
    ["b"]=> 
    string(4) "test" refcount(1) 
} 
+0

매우 흥미 롭습니다. 내 다음 질문은 실제로 refcount가 메모리 누수가 발생하는 이유를 파악하는 것에 관한 것입니다. 감사! –

11

개체를 serialize하고 문자열 길이를 읽는 것이 좋지 않습니까? 직렬화 된 문자열은 s : '문자열'이므로 s : ''는 추가 바이트가됩니다 ... serialize가 PHP 저장 객체와 동일한 방법이 될 수 없다면 분명히 ???

그래서

$size = strlen(serialize($object)); 

그냥 생각 예를

하시나요?

또 다른 혼란 만 가능 정확한 생각 :

이후 몇 번 조작 된 클래스 인스턴스 변수를 가정은 인스턴스 :

$DB; // database access class for eg. 
$mem = memory_get_usage(); 
$DB_tmp = clone $DB; 
$mem = memory_get_usage() - $mem; 
unset($DB_tmp); 

는 $ (MEM)는 $ DB에 할당 된 메모리의 정확한 금액이 될 수 ;

function getMemoryUsage($var) { 
    $mem = memory_get_usage(); 
    $tmp = unserialize(serialize($var)); 
    // Return the unserialized memory usage 
    return memory_get_usage() - $mem; 
} 

을 나는 그것이 적어도 더 나은 결과를보고 생각 :

+0

** 복제 **는 나를 위해 작동하지 않습니다 (이유를 모르겠습니다). 객체를 복제 한 후 항상 100 바이트를보고합니다. –

1

(Prof83's answer에서) 복제 나를 위해 작동하지 않았기 때문에, 나는 직렬화하고 크기가 나는 측정 할 변수를 unserialize하려고 나를 위해.

+0

당신은'$ tmp' 변수를 사용하지 않았습니다. –

0

다음 코드가 아닌 객체의 크기를 알고 싶다면 브라우저에 return을 입력하면 네트워크에서 얼마나 많은 양을 전송할 수 있는지 알 수 있습니다.

관련 문제