一、内存缓存机制
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会自动调用一个方法去遍历每一个值,如果发现是垃圾就清理