浅谈PHP内存分配管理机制

下面先看一下内存的一些变化过程:

浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin

浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin

为什么,unset释放内存后,与第一次输出的不一样呢。其实是输出函数占用了部分内存。
下面我们在看下:

浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin
 
浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin
 
这样内存就相同了。。

PHP的unset确实会释放内存(当然, 还要结合引用和计数), 但这个释放不是C编程意义上的释放, 不是交回给OS。 对于PHP来说, 它自身提供了一套和C语言对内存分配相似的内存管理API。

浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin
 
这些API和C的API意义对应, 在PHP内部都是通过这些API来管理内存的。

当我们调用emalloc申请内存的时候,PHP并不是简单的向OS要内存,而是会像OS要一个大块的内存,然后把其中的一块分配给申请者, 这样当再有逻辑来申请内存的时候,就不再需要向OS申请内存了,避免了频繁的系统调用。

eg:
浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin
 
浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin
 
 也就是我们在定义变量$string 时,PHP并没有向系统申请新的内存。

同样的, 在我们调用efree释放内存的时候, PHP也不会把内存还给OS,,而会把这块内存,,归入自己维护的空闲内存列表.,而对于小块内存来说,,更可能的是, 把它放到内存缓存列表中去。

关于数组的内存分配:
Hashtable是PHP的核心结构,数组也是用它来表示的,而符号表也是一种关联数组, 对于如下代码:

浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin

我们定义了100个变量, 然后又Unset了他们,,来看看输出:
 
浅谈PHP内存分配管理机制 - kaizhu_QIN - kaizhu_Qin

这是因为对于Hashtable来说,定义它的时候,不可能一次性分配足够多的内存块,来保存未知个数的元素,,所以PHP会在初始化的时候, 只是分配一小部分内存块给HashTable,,当不够用的时候再RESIZE扩容。

而Hashtable, 只能扩容,不会减少,对于上面的例子,当我们存入100个变量的时候, 符号表不够用了,做了一次扩容, 而当我们依次unset掉这100个变量以后,变量占用的内存是释放了(334172– 325752),但是符号表并没有缩小,所以这些少的内存是被符号表本身占去了....
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值