2017-10-12 17:17:50 2462次浏览 1条回答 0 悬赏 100 金钱

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

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

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

  • 回答于 2017-10-17 15:16 举报

    不明觉历

    1、既然有出处,好歹分享一下出处文章的链接吧(虽然搜索很好用,不过还是需要成本的)
    2、如果真的想理解php的内存分配,建议还是学学C相关的东西看看源码,或者请教下有相关经验的人,了解的会更透彻一些。

    不过既然写了回答,我也简单说点个人看法。当然也只是根据原文的意思揣摩,没有什么准确的依据。

    依照原文标题“请手动释放你的资源”,再围绕你节选的这段文字。php在执行的时候会申请两块内存(会自动释放一大块+一小块),当然这个“自动释放”是发生在执行结束的时候。然后就有了“后续的逻辑如果请求内存”,发现之前申请的大块内存已经被用完(可能包含了很多已经无效的资源,但是没有被手动释放),就会再次向操作系统申请内存。
    所以前后文所提到的重新申请内存,都是指大块内存,而不是保留下来的那块小内存,小内存是用于做引用计数或者说内存管理用的。也就是说,小块内存是给系统用的,而不是给业务逻辑代码自身用的,当进程执行结束之后会一并释放。
    进而可以知道,就是因为很多无效资源没有及时的释放,从而导致了需要多次申请内存,增加了系统开销。也就印证了文章标题“请手动释放你的资源”。

    还有一点想说的是,这个文章也比较老了,如果希望真正了解PHP内存管理的话,建议针对文章中提到的“垃圾回收”做一下扩展阅读。

    另外个人感觉80%做php的都不知道这个内存分配究竟是啥,当然也包括我
    这80%的人里面可能90%都不关心这个问题 哈哈

    顺便附上原文链接 http://www.laruence.com/2012/07/25/2662.html

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
xyf90314
副总裁

xyf90314

注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
  • 粉丝21
  • 金钱5257
  • 威望40
  • 积分6607

热门问题