to dear walkor:
$obj = new $class(); //记录到对象池 Gdate::$objPool = &$obj;
如上 我会把所有new过的对象都放入一个对象池里面,当一个请求结束后 我需要 手动销毁所有对象 请问这个要怎么弄,直接 unset ?还是设值为null?试了下 unset掉 Gdate::$objPool 原本的 对象还存在 zend会拷贝一份,设置为null是可以的,但不知道是不是标准做法
试了下 unset掉 Gdate::$objPool 原本的 对象还存在 zend会拷贝一份
是怎么看出来的呢?
一般unset()就可以了,另外对象不用传引用的,对象本身就是类似一种引用的机制。
你是说 当 php new一个对象的时候 是对该内存块重新构造初始化了一下吗? 不过我试了下 当请求不停过来 不停的new的时候 是越来越多的对象
$aa = new \stdClass(); $aa->test1 = 123; $aa->test2 = 456; self::$tmp = &$aa; $bb = new \stdClass(); $bb->t1 = "ssss"; $bb->t2 = "ooooo"; self::$tmp = &$bb; $bb->t3 = "ppppppppppppp"; var_dump(self::$tmp); foreach (self::$tmp as $key => $o) { unset(self::$tmp); //self::$tmp = null; } var_dump(self::$tmp); echo "*************_**__**_{$bb->t2}**************";
我是这样测试的
根据php gc机制,如果没有任何变量引用这个对象,对象就自动释放了。 因为$bb变量还引用着对象,所以$bb变量是可以访问到对象的。 如果再unset($bb);或者离开变量作用域那么就都会释放了。
直接设置 self::$tmp = null; 虽然可以释放,但是self::$tmp里面仍然有多个null元素,不unset掉的话会有内存泄漏
那 如果 是 在 onMessage回调里面多次new了对象的话 应该是不需要手动去释放的把?
函数里临时变量不需要手动unset,临时变量都会自动gc的。 全局变量或者静态变量需要手动unset
ok
是怎么看出来的呢?
一般unset()就可以了,另外对象不用传引用的,对象本身就是类似一种引用的机制。
你是说 当 php new一个对象的时候 是对该内存块重新构造初始化了一下吗? 不过我试了下 当请求不停过来 不停的new的时候 是越来越多的对象
我是这样测试的
根据php gc机制,如果没有任何变量引用这个对象,对象就自动释放了。
因为$bb变量还引用着对象,所以$bb变量是可以访问到对象的。
如果再unset($bb);或者离开变量作用域那么就都会释放了。
直接设置 self::$tmp = null; 虽然可以释放,但是self::$tmp里面仍然有多个null元素,不unset掉的话会有内存泄漏
那 如果 是 在 onMessage回调里面多次new了对象的话 应该是不需要手动去释放的把?
函数里临时变量不需要手动unset,临时变量都会自动gc的。
全局变量或者静态变量需要手动unset
ok