zoukankan      html  css  js  c++  java
  • PHP内存管理机制与垃圾回收机制

    转载:https://www.cnblogs.com/zk0533/p/5667122.html

    PHP内存管理机制

    var_dump(memory_get_usage());   //获取内存
    $a = "laruence";                //定义一个变量
    var_dump(memory_get_usage());   //定义变量之后获取内存
    unset($a);                      //删除该变量
    var_dump(memory_get_usage());   //删除变量后获取内存
    E:code	ppublic\_memory.php:9:int 385048
    E:code	ppublic\_memory.php:11:int 385048
    E:code	ppublic\_memory.php:13:int 385048

    从上面可以看出php的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间。

    1.存储变量名,存在符号表。

    2.变量值存储在内存空间。

    3.在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小。

    var_dump(memory_get_usage());  //获取内存
    //定义100个变量
    for($i=0;$i<100;$i++)
    {
        $a = "test".$i;
        $$a = "hello";
    }
    //获取定义100个变量之后的内存
    var_dump(memory_get_usage());
    //定义100个变量并删除
    for($i=0;$i<100;$i++)
    {
        $a = "test".$i;
        unset($$a);
    }
    //获取删除之后的内存
    var_dump(memory_get_usage());
    E:code	ppublic\_memory.php:16:int 386664
    E:code	ppublic\_memory.php:24:int 391368
    E:code	ppublic\_memory.php:32:int 388992

    从上面可以看出,虽然删除后内存变小了,但还是比没定义变量之前时大,这是因为虽然删除了变量的值,但变量名没有被删除。

    php垃圾回收机制

    PHP变量存储是存储在一个zval容器里面的

    1.类型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向该值的变量数量

    1.变量赋值的时候:is_ref为false  refcount为1

    $a = 1;
    xdebug_debug_zval('a');
    echo PHP_EOL;
    a:
    (refcount=0, is_ref=0)int 1

    2.将变量a的值赋给变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候

    $b = $a;
    xdebug_debug_zval('a');
    echo PHP_EOL;
    a:
    (refcount=0, is_ref=0)int 1

    3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去。所以变量a的zavl容器中refcount会减1变为1,变量c指向a,所以refcount会加1变为2

    $c = &$a;
    xdebug_debug_zval('a');
    echo PHP_EOL;
    xdebug_debug_zval('b');
    echo PHP_EOL;
    a:
    (refcount=2, is_ref=1)int 1
    b:
    (refcount=0, is_ref=0)int 1

    垃圾回收:

    1.在5.2版本或之前版本,PHP会根据refcount值来判断是不是垃圾

    如果refcount值为0,PHP会当做垃圾释放掉

    这种回收机制有缺陷,对于环状引用的变量无法回收

    2.在5.3之后版本改进了垃圾回收机制

    如果发现一个zval容器中的refcount在增加,说明不是垃圾

    如果发现一个zval容器中的refcount在减少,如果减到了0,直接当做垃圾回收

    如果发现一个zval容器中的refcount在减少,并没有减到0,PHP会把该值放到缓冲区,当做有可能是垃圾的怀疑对象。

    当缓冲区达到了临界值,PHP会自动调用一个方法去遍历每一个值,如果发现是垃圾就清理

  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/jiangxiaobo/p/11063106.html
Copyright © 2011-2022 走看看