怎么理解php函数在内存的分配,【php】php内存分配怎么理解

PHP之所以会在请求结束后正确的释放掉所有的资源, 内存, 这是因为当我们在脚本中使用新的内存的时候, PHP会向OS申请一大块内存(ZEND_MM_SEG_SIZE大小), 然后分给你你需要的合适的一块小内存.

当你不使用这块小内存的时候, PHP也不会返还给OS, 而是保留下来给后续的处理使用.

所以, 如果你使用完了资源不及时释放, 那么后续的逻辑如果请求内存, PHP发现之前申请的一大块内存已经分光了, 它就只好再次向OS发起malloc调用, 得到一块新的大内存. 并且它还需要对这个大内存做一些标记处理..

而如果你使用完资源, 及时释放的话, 那么下次脚本申请内存的时候, 你之前归还的内存块就可以被重复利用, 那么也许你的整个脚本只需要和OS申请一次内存.

上面这段话出自鸟哥的一篇文章,黑色字体的2句话不是很明白,竟然小内存不会返还给OS而是给后续的逻辑使用,那么后续的逻辑为什么还要去请求内存呢?因为从这2句黑体语句中我的理解是第二句黑体的文字是不会使用到第一句黑体文字不用的内存的

回答

PHP之所以会在请求结束后正确的释放掉所有的资源, 内存, 这是因为当我们在脚本中使用新的内存的时候, PHP会向OS申请一大块内存(ZEND_MM_SEG_SIZE大小), 然后分给你你需要的合适的一块小内存. 当你不使用这块小内存的时候, PHP也不会返还给OS, 而是保留下来给后续的处理使用.PHP之所以会在请求结束后正确的释放掉所有的资源, 内存, 这是因为当我们在脚本中使用新的内存的时候, PHP会向OS申请一大块内存(ZEND_MM_SEG_SIZE大小), 然后分给你你需要的合适的一块小内存. 当你不使用这块小内存的时候, PHP也不会返还给OS, 而是保留下来给后续的处理使用.所以, 如果你使用完了资源不及时释放, 那么后续的逻辑如果请求内存, PHP发现之前申请的一大块内存已经分光了, 它就只好再次向OS发起malloc调用, 得到一块新的大内存. 并且它还需要对这个大内存做一些标记处理.而如果你使用完资源, 及时释放的话, 那么下次脚本申请内存的时候, 你之前归还的内存块就可以被重复利用, 那么也许你的整个脚本只需要和OS申请一次内存.

整合起来看更容易理解。

首先明确PHP所有申请的内存在PHP脚本执行结束之前不会自动释放。

这里需要理解PHP脚本的执行方式,每次PHP接收并处理一个新的请求是PHP运行的一次生命周期,在这个过程中你的PHP代码定义了很多类,函数使用了很多变量,类方法和函数运行过程是不是需要内存咧,变量是不是需要变量咧,方法或函数中定义的变量在调用执行后这部分局部变量使用的内存被回收,这是使用的一部分内存,另一部分是全局变量。局部变量会在方法或函数执行结束后自动释放,但是全局变量不会释放,除非你手动销毁,注意啦这里的释放或销毁的内存不会返回给OS,它还在PHP手里,举个栗子吧:国家、酒店和客人;在一个国家内所有财产都属于这个国家(OS);酒店提供商(PHP)向国家申请建立一个或多个酒店,酒店提供商拥有酒店管理权;客人来酒店入住酒店,有人常住(全局变量),有的人住一段时间(局部变量),不住的房间酒店回收给下一个客人入住。因为入住火爆,所有的房间都住满了,酒店提供商继续申请建设新酒店(申请新内存);直到酒店提供商最后倒闭了(PHP执行结束),国家收回酒店提供商的财产。这就是PHP一次生命周期内存的原理。

你直接把两句话连起来读当然给你一个错误的理解啊。

没看到第二句话的前提吗?

如果你使用完了资源不及时释放,那么后续的逻辑如果请求内存, PHP发现之前申请的一大块内存已经分光了

第一句话说的这些内存,指的是你的脚本释放掉了资源,从而使得PHP得以重新利用这块内存。而第二句话说的,是在你没有释放资源的前提下,也就是你都没有告诉PHP你不需要使用这块内存的时候,PHP才会重新向系统申请内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值