php中实例化的对象什么时候会释放
怪我咯
怪我咯 2017-04-10 15:06:22
[PHP讨论组]

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

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
迷茫

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

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

迷茫

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

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

参考文章

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

PHPz

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号