2009-08-29 89 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爲循環引用引入的垃圾收集器? – 2009-08-29 16:56:26

+0

好吧,但除了Pascal提到的之外,我希望能夠在不同的時間找到它,而不僅僅是在分配時。我想在這條路上找到很多線路。 – 2009-08-29 17:18:01

+0

@Pascal:PHP將不會釋放仍在使用的對象所引用的內存。循環引用表示引用B和B引用A,但沒有其他引用A或B.因此,只要程序仍然可以以任何方式引用它,內存就不會被釋放。 – 2009-08-29 19:08:22

3

我不認爲這是完全可能的;我從來沒有見過任何可以讓你在內存中獲得對象大小的東西。

一個解決方案來獲得一個非常粗略的想法可能是序列化你的數據,並使用strlen ...但這真的是一個估計的東西......我不會很依賴任何像那,其實......


即使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

非常有趣。我的下一個問題實際上是關於讓refcounts找出爲什麼有內存泄漏。謝謝! – 2009-08-29 17:51:06

11

嘗試序列化對象並讀取字符串長度沒有意義嗎?很明顯,它會關閉幾個字節,因爲序列化的字符串會有s:'string',因此s:''是額外的字節......除非序列化可以像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的具體金額;

+0

**克隆**不適合我(我不知道爲什麼)。克隆對象後總是報告100個字節。 – 2014-12-12 11:05:49

1

由於克隆(從Prof83's answer)並沒有爲我工作,我試圖序列化和反序列我要測量其大小變量:

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

我認爲它報告更好的結果,至少爲了我。

+0

你沒有使用'$ tmp'變量 – 2016-05-22 04:51:01

0

如果你只是想知道對象的大小,而不是你的下一個代碼,return它到瀏覽器,你可以看到多少網絡傳輸 的對象。