下载此文档

Php引用计时器和垃圾回收机制.doc


文档分类:论文 | 页数:约7页 举报非法文档有奖
1/7
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/7 下载此文档
文档列表 文档介绍
Php引用计时器和垃圾回收机制,垃圾回收站的利润在哪,垃圾回收机制,gc垃圾回收机制,jvm垃圾回收机制,java垃圾回收机制,python垃圾回收机制,js垃圾回收机制,垃圾回收机制原理,简述java垃圾回收机制谈到引用计数器和垃圾回收机制,必须得从php变量说起。总所周知,php是一种弱类型,但具体表现在哪里,程序里面又是怎么表现的呢?php里面又是怎样实现引用计数器的,程序如何区分变量引用和复制?php是如何对已用完的变量进行回收,不同的php版本的不同的垃圾回收机制又是如何实现的?
引用计数器
讲到引用计数器,不得不先说一下变量的c语言实现。如下,几个变量的结构体和联合体:
zvalue_value联合体:
typedef union _zvalue_value {  
  long lval;                  /* long value */ 
  double dval;                /* double value */ 
struct {  
char *val;  
  int len;  
} str;  
HashTable *ht;              /* hash table value */ 
  zend_object_value obj;  
} zvalue_value;  
zval的结构:
struct _zval_struct {  
  /* Variable information */ 
  zvalue_value value;       
/* value */ 
zend_uint refcount__gc;  
  zend_uchar type;    /* active type */ 
  zend_uchar is_ref__gc;  
}; 
zval可以看成一个容器,zvalue_value是该容器存储变量值的联合体,refcount__gc是引用计数,记录引用数,is_ref__gc是标志这个容器是否真正的引用,type表示这个变量的类型。
zend根据type值来决定访问value的哪个成员,可用值如下:
IS_NULL
N/A
IS_LONG

IS_DOUBLE

IS_STRING

IS_ARRAY

IS_OBJECT

IS_BOOL
.
IS_RESOURCE

根据这个表格可以发现两个有意思的地方:首先是PHP的数组其实就是一个HashTable,这就解释了为什么PHP能够支持关联数组了;其次,Resource就是一个long值,它里面存放的通常是个指针、一个内部数组的index或者其它什么只有创建者自己才知道的东西,可以将其视作一个handle。
写复制(Copy on Write)
<?php
  $var = "laruence";
$var_dup = $var;
$var = 1;
?>
PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的例程, 对于上面的代码,当执行到第三行的时候,PHP发现$var指向的zval的refcount大于1,那么PHP就会复制一个新的zval出来,将原zval的refco

Php引用计时器和垃圾回收机制 来自淘豆网www.taodocs.com转载请标明出处.