资讯专栏INFORMATION COLUMN

php中的内存管理

EasonTyler / 3325人阅读

摘要:向系统进行的内存申请,并不是有需要时向系统即时申请,而是由的最底层层先向系统申请一大块的内存,通过对上面三种列表的填充,建立一个类似于内存池的管理机制。在程序运行需要使用内存的时候,会在内存池中分配相应的内存供使用。

一、php内存管理概述——Zend引擎

由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的。

应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的库函数 向操作系统申请内存。

在一些对性能要求较高的应用场景下是需要频繁的使用和释放内存的, 比如Web服务器,编程语言等,由于向操作系统申请内存空间会引发系统调用, 系统调用和普通的应用层函数调用性能差别非常大,因为系统调用会将CPU从用户态切换到内核, 因为涉及到物理内存的操作,只有操作系统才能进行,而这种切换的成本是非常大的, 如果频繁的在内核态和用户态之间切换会产生性能问题。

鉴于系统调用的开销,一些对性能有要求的应用通常会自己在用户态进行内存管理, 例如第一次申请稍大的内存留着备用,而使用完释放的内存并不是马上归还给操作系统, 可以将内存进行复用,这样可以避免多次的内存申请和释放所带来的性能消耗。

PHP不需要显式的对内存进行管理,这些工作都由Zend引擎进行管理了。PHP内部有一个内存管理体系, 它会自动将不再使用的内存垃圾进行释放。

二、php中查看与设置内存的相关参数与函数

配置内存大小:

(1)php.ini中可以更改配置memory_limit = 32M
(2)若环境中没有禁用ini_set()函数,可以通过此函数设置:ini_set("memory_limit", "128M");

查看内存情况:

(1)memory_get_usage(),这个函数的作用是获取 目前PHP脚本所用的内存大小。
(2)memory_get_peak_usage(),这个函数的作用返回 当前脚本到目前位置所占用的内存峰值,这样就可能获取到目前的脚本的内存需求情况。

三、ZendMM内存分配和销毁

PHP底层对内存的管理, 围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和 剩余内存列表(rest_buckets)三个列表来分层进行的。

ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存,通过对上面三种列表的填充, 建立一个类似于内存池的管理机制。

在程序运行需要使用内存的时候,ZendMM会在内存池中分配相应的内存供使用。 这样做的好处是避免了PHP向系统频繁的内存申请操作。

ZendMM在内存销毁的处理上采用与内存申请相同的策略,当程序unset一个变量或者是其他的释放行为时, ZendMM并不会直接立刻将内存交回给系统,而是只在自身维护的内存池中将其重新标识为可用, 按照内存的大小整理到上面所说的三种列表(small,large,free)之中,以备下次内存申请时使用。

具体的详情可参考:http://www.php-internals.com/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31117.html

相关文章

  • PHP内存模型

    摘要:为单进程的由代执行每一个请求由从进程池中取出进程初始化数据结构创建进程变量共享类似于的内容为所有进程所共享即单例模式默认是采用磁盘文件实现的管理即变量是一次请求说单独的享有的不能被所有请求所共享共享由于每次请求代由创建进程所以由共享问题是使 php为单进程的,由apache代执行,每一个请求,由apache从进程池中取出进程,初始化数据结构,创建进程. 变量共享,类似于session的...

    Maxiye 评论0 收藏0
  • PHP7源码分析】PHP内存管理

    摘要:分页管理先说说虚拟内存的概念。每个存在的虚拟页面都保存在某个区域中,不属于任何一个区域的虚拟页是不存在的,不能被进程使用内核为系统中的每个进程维护一个单独的任务结构,任务中的一个字段指向,他描述了虚拟内存的当前状态。 作者: 顺风车运营研发团队 李乐 第一章 从操作系统内存管理说起 程序是代码和数据的集合,进程是运行着的程序;操作系统需要为进程分配内存;进程运行完毕需要释放内存;内存管...

    waltr 评论0 收藏0
  • PHP|什么是CGI, FastCGI, PHP-CGI, PHP-FPM, Spawn-FCGI

    摘要:当客户端请求到达时,进程管理器选择并连接到一个解释器。什么是是一个管理器,是只用于的可以在下载得到其实是源代码的一个补丁,旨在将进程管理整合进包中。与功能比较都是守护的进程管理器。 什么是CGI CGI全称是公共网关接口(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行交谈的一种工具,其程序须运行在网络服务器上。 CGI可以用任何一种语言编...

    el09xccxy 评论0 收藏0
  • 什么是CGI、FastCGI、PHP-CGI、PHP-FPM

    摘要:的工作原理启动时载入进程管理器或进程管理器自身初始化,启动多个解释器进程可见多个并等待来自的连接。当客户端请求到达时,进程管理器选择并连接到一个解释器。什么是是一个管理器,是只用于的其实是源代码的一个补丁,旨在将进程管理整合进包中。 什么是CGI CGI全称是公共网关接口(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行交谈的一种工具,其程...

    MycLambert 评论0 收藏0
  • PHP 垃圾回收与内存管理指引

    摘要:本文将要讲述发展历程中的垃圾回收及内存管理相关内容,文末给出发展在各个阶段有关内存管理及垃圾回收内核参考资料值得阅读。引用计数在及以前的版本中,的垃圾回收采用的是引用计数算法。回收周期当缓冲区满时,对缓冲区中的所有可能根进行垃圾回收处理。 showImg(https://segmentfault.com/img/bVbe29F?w=800&h=440); 本文首发于 PHP 垃圾回收与...

    Tychio 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<