• 内存缓存机制and垃圾回收机制


    一、内存缓存机制

    var_dump(memory_get_usage(true));
    $a="laruence";
    var_dump(memory_get_usage(true));
    unset($a);
    var_dump(memory_get_usage(true));

    1.加上true之后,显示的三个相等的数代表php申请的内存大小,无论你是空着还是向里面存数据,都显示php申请的内存,当你存储的数据过大时,php会再申请一块新的内存进行扩充,这样就避免了php经常性的调用内存。

    2.所有php内存缓存机制是:php不是每次定义一个数据就申请一次内存,而是预先申请一块内存,当存储数据不够时,再次申请一块内存扩充

    3.

    //$a="hello";
    //1.存储的变量名,存在符号表里。
    //2.变量值存储在内存空间
    //3.在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小

    4.例如:

    var_dump(memory_get_usage());
    for($i=0;$i<100;$i++)
    {
    	$a="test".$i;
    	$$a="hello";
    }
    var_dump(memory_get_usage());
    for($i=0;$i<100;$i++)
    {
    	$a="test".$i;
    	unset($$a);
    }
    var_dump(memory_get_usage());
    

      

    二、垃圾回收机制

    1.

    //php变量存储是存储在一个zval容器里面的
    //zval大体分为四块
    //1.类型 2.变量值 3.is_ref 布尔型代表是否有地址引用 4.refcount 指向该值得变量的个数

    2.例如

    //1.变量赋值的时候:is_ref为false  refcount为1
    $a=1;
    xdebug_debug_zval('a');
    echo PHP_EOL;
    
    //2.将变量a的值赋变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候
    $b=$a;
    xdebug_debug_zval('a');
    echo PHP_EOL;
    
    //3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去(b不指向a了,但是c又指向a了)
    
    $c=&$a;
    xdebug_debug_zval('a');
    echo PHP_EOL;
    
    xdebug_debug_zval('b');
    echo PHP_EOL;

    3.

    //垃圾回收:
    //1.在5.2版本之前,php会根据refcunt值来判断是不是垃圾
    //如果refcount值为0,php会当做垃圾释放掉
    //这种回收机制有缺陷,对于环装引用的变量无法回收

    //环状引用
    $attr=array("hello");
    $attr[]=&$attr;
    
    xdebug_debug_zval("attr");
    echo PHP_EOL;
    

      

    //2.在5.3之后版本改进了垃圾回收机制
    //如果发现一个zval容器中的refcount在增加,说明不是垃圾
    //如果发现zval容器中的refcount在减少,如果减少到0,直接当做垃圾回收
    //如果发现zval容器中的refcount在减少,并没有减少到0,php会把该值放到缓冲区,当做有可能是垃圾的怀疑对象。
    //当缓冲区达到临界值,php会自动调用一个方法去遍历每一个值,如果发现是垃圾就清理

     

  • 相关阅读:
    qt自定义的串口类判断断开
    ubuntu16.04永久修改有线接口名称(enp0s3->eth0)
    记录一下读过的书
    Qt 主界面卡死
    Mysql5.7及版本以上导入sql提示Incorrect date value: '0000-00-00' for column
    webpack打包css
    ant-design-vue中的a-directory-tree更换图标
    解决php-fpm占用内存过高问题
    centos,解压源代码安装,没有configure文件
    OSS存储上遇到The difference between the request time and the current time is too large
  • 原文地址:https://www.cnblogs.com/zst062102/p/5659495.html
Copyright © 2020-2023  润新知