Maison >développement back-end >tutoriel php >php中实例化的对象什么时候会释放

php中实例化的对象什么时候会释放

WBOY
WBOYoriginal
2016-06-06 20:41:291548parcourir

有时候用php在处理比较大的数据的时候,会报内存不够的错误。
想到实例化可能会占据内存,unset掉之后并没有改善多少,那么php中实例化的对象会在什么时候被释放?

回复内容:

有时候用php在处理比较大的数据的时候,会报内存不够的错误。
想到实例化可能会占据内存,unset掉之后并没有改善多少,那么php中实例化的对象会在什么时候被释放?

php是有垃圾回收(Garbage Collection)机制的。具体可以查阅文档:http://php.net/manual/zh/features.gc.php

垃圾回收机制就是最早在Lisp中被提出,关于更多垃圾回收的信息.
参见维基百科:http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

这种时候你就应该考虑你处理数据的算法和机制了, 你说实例化会占用内存, 那你是不是在这个大数据里经常实例化对象呢, 既然是大数据, 你还在里面一直实例化,好像就不太合适了。
另外, unset销毁的只是该对象, 并没有销毁该对象在内存中的占用, 这里引用一句话:

<code>当给一个变量赋值(或者相类似的操作),内存会开辟一个空间存储,这时候会产生两个重要的概念,一个是“内存的地址”,一个是“地址内的内容”。unset打断了变量与地址间的联系。而php会自动检测内存地址里的数据是否完全没有跟其它变量产生联系,在确定没有的情况下会回收内存。所以要回收内存,那就要把所有的联系打断。
</code>

参考文章

unset函数内存分配和销毁问题探秘
php unset对象实例

php原来是通过引用计数器来实现内存回收,也就是是多个php变量可能会引用同一份内存,这种情况unset掉其中一个是不会释放内存的;
例如:
$a = 1; $b = $a; unset($a);
另外,离开了变量的作用域后变量所占用的内存就会被自动清理(不包含静态变量),如函数或方法内的局部变量,对这些局部变量进行unset在函数外来看内存也是没有减少的。

最后,引用计数有个缺陷,就是当循环引用出现时,计数器没法清0,内存占用会持续到页面访问结束。对于这个问题PHP5.3中增加了垃圾回收机制。嗯,就是1楼提到的

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn