• PHP内存管理机制


    内存一直都是神秘的内容,那我们PHP在处理的时候是怎样来分配我们的内存?

    PHP不需要显式的对内存进行管理,这些工作都由PHP解释器进行了。由此PHP内部有一个内存管理体系, 它会自动将不再使用的内存垃圾进行释放,php的默认内存大小是32M,在php.ini中memory_limit = 32M

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

    从开始就有一套属于自己的内存管理机制,在5.3之前使用的是经典的引用计数技术,但引用技术存在一定的技术缺陷,在PHP5.3之后,引入了新的垃圾回收机制,至此,PHP的内存管理机制更加完善。

    一次性读取超大的文件到内存中,或者出现超大的数组,或者在大循环中的没有及时是放掉不再使用的变量, 这些都有可能会造成内存占用过大而被终止

    Fatal error:Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

    内存管理一般会包括以下内容:

    • 是否有足够的内存供我们的程序使用;
    • 如何从足够可用的内存中获取部分内存;
    • 对于使用后的内存,是否可以将其销毁并将其重新分配给其它程序使用。

     

    PHP底层对内存的管理, 围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和剩余内存列表(rest_buckets)三个列表来分层进行的。 ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请,而是由ZendMM的最底层(heap层)先向系统申请一大块的内存,通过对上面三种列表的填充,建立一个类似于内存池的管理机制。 在程序运行需要使用内存的时候,ZendMM会在内存池中分配相应的内存供使用。这样做的好处是避免了PHP向系统频繁的内存申请操作

    PHP对内存的分配,是结合PHP的用途来设计的,PHP一般用于web应用程序的数据支持,单个脚本的运行周期一般比较短(最多达到秒级),内存大块整块的申请,自主进行小块的分配, 没有进行比较复杂的不相临地址的空闲内存合并,而是集中再次向系统请求。 这样做的好处就是运行速度会更快,缺点是随着程序的运行时间的变长,内存的使用情况会“越来越多”(PHP5.2及更早版本)。 所以PHP5.3之前的版本并不适合做为守护进程长期运行。

    销毁

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

  • 相关阅读:
    将参数传递给线程(Vc#2005)
    ADO.NET更新ACCESS碰到的怪异问题
    MVCRESTSilverLight 之 MapServiceRoute
    MEF Export 和 Import 委托
    MVCRESTSilverLight 之MainPage.xaml.cs
    设计模式访问者
    MVCRESTSilverLight 之 ViewModels\MainViewModel.cs
    MVCRESTSilverLight 之Api\CustomerApi.cs
    MVCRESTSilverLight 之 RestExample.Model.Silverlight\Customer.cs
    MVCRESTSilverLight 之 HttpConfiguration
  • 原文地址:https://www.cnblogs.com/huxuanjing/p/12585058.html
Copyright © 2020-2023  润新知