PHP가 사용하는 총 메모리 (memory_get_usage()
)를 얻을 수있는 방법이 있지만 개별 객체의 메모리 크기를 어떻게 얻습니까?PHP에서 객체의 크기를 가져 오는 중입니까?
잠재적으로 복잡한 데이터 구조에서 바이트 수를 원하는만큼 분명히 count()
에 대해 이야기하지 않습니다.
PHP가 사용하는 총 메모리 (memory_get_usage()
)를 얻을 수있는 방법이 있지만 개별 객체의 메모리 크기를 어떻게 얻습니까?PHP에서 객체의 크기를 가져 오는 중입니까?
잠재적으로 복잡한 데이터 구조에서 바이트 수를 원하는만큼 분명히 count()
에 대해 이야기하지 않습니다.
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을 확인할 수 있습니다 그 물체는 배정 시점에있었습니다. 할당 한 후에 추가하면 할당 된 크기가 더 이상 정확하지 않게됩니다.
나는 이것이 가능하다고 생각하지 않는다. 나는 당신이 메모리에있는 물체의 크기를 얻을 수있는 것을 본 적이 없다.
꽤 근사한 아이디어를 얻는 해결책은 데이터를 직렬화하고 그걸 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)
}
매우 흥미 롭습니다. 내 다음 질문은 실제로 refcount가 메모리 누수가 발생하는 이유를 파악하는 것에 관한 것입니다. 감사! –
개체를 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;
}
을 나는 그것이 적어도 더 나은 결과를보고 생각 :
** 복제 **는 나를 위해 작동하지 않습니다 (이유를 모르겠습니다). 객체를 복제 한 후 항상 100 바이트를보고합니다. –
(Prof83's answer에서) 복제 나를 위해 작동하지 않았기 때문에, 나는 직렬화하고 크기가 나는 측정 할 변수를 unserialize하려고 나를 위해.
당신은'$ tmp' 변수를 사용하지 않았습니다. –
다음 코드가 아닌 객체의 크기를 알고 싶다면 브라우저에 return
을 입력하면 네트워크에서 얼마나 많은 양을 전송할 수 있는지 알 수 있습니다.
PHP가 "잘못된 시간"에 할당 된 상태로 유지 된 메모리를 해제하기로 결정한 경우 어떻게해야합니까? PHP가 메모리를 해제 할 때 ("필요한 경우"라고 생각합니다) 실제로 알지 못합니다. 그러나이 해제가 일부 문제를 일으킬 수 있다고 생각합니까? 특히 순환 참조를 위해 PHP 5.3에서 도입 된 가비지 컬렉터는 무엇입니까? –
그래,하지만 파스칼이 언급 한 것에 덧붙여, 할당 시간이 아닌 다른 시간에 이것을 찾을 수 있기를 바란다. 도로 아래로 여러 줄을 찾으려합니다. –
@Pascal : PHP는 여전히 사용중인 객체에 의해 참조되는 메모리를 해제하지 않습니다. 순환 참조는 A 참조 B와 B 참조 A를 의미하지만 다른 것은 A 나 B를 참조하지 않습니다. 따라서 프로그램이 어떤 식 으로든 참조 할 수있는 한 메모리는 해제되지 않습니다. –