有一種方法可以獲得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 ...但這真的是一個估計的東西......我不會很依賴任何像那,其實......
即使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)
}
非常有趣。我的下一個問題實際上是關於讓refcounts找出爲什麼有內存泄漏。謝謝! – 2009-08-29 17:51:06
嘗試序列化對象並讀取字符串長度沒有意義嗎?很明顯,它會關閉幾個字節,因爲序列化的字符串會有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的具體金額;
**克隆**不適合我(我不知道爲什麼)。克隆對象後總是報告100個字節。 – 2014-12-12 11:05:49
由於克隆(從Prof83's answer)並沒有爲我工作,我試圖序列化和反序列我要測量其大小變量:
function getMemoryUsage($var) {
$mem = memory_get_usage();
$tmp = unserialize(serialize($var));
// Return the unserialized memory usage
return memory_get_usage() - $mem;
}
我認爲它報告更好的結果,至少爲了我。
你沒有使用'$ tmp'變量 – 2016-05-22 04:51:01
如果你只是想知道對象的大小,而不是你的下一個代碼,return
它到瀏覽器,你可以看到多少網絡傳輸 的對象。
如果PHP決定釋放被分配的內存,只是在「錯誤的時間」?我真的不知道PHP什麼時候釋放內存(我想是什麼時候「需要時」),但我猜這個釋放會帶來一些問題?尤其是使用PHP 5.3爲循環引用引入的垃圾收集器? – 2009-08-29 16:56:26
好吧,但除了Pascal提到的之外,我希望能夠在不同的時間找到它,而不僅僅是在分配時。我想在這條路上找到很多線路。 – 2009-08-29 17:18:01
@Pascal:PHP將不會釋放仍在使用的對象所引用的內存。循環引用表示引用B和B引用A,但沒有其他引用A或B.因此,只要程序仍然可以以任何方式引用它,內存就不會被釋放。 – 2009-08-29 19:08:22