PHP在循环内外实例化类在占用内存上有很大的区别

9条评论

2012 年 01 月 16 日 at 下午 3:14分类:PHP

关于php类的实例化和内存的关系,可以这么说:只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间 ,那么OK,看代码。

<?php
class ABC{
    public $numBox = array();
    public function ddd(){
            for($i=1; $i<=600; $i++){
                    $this->numBox[] = mt_rand(1,1000000);
           }
                echo 'Now memory_get_usage: '.memory_get_usage().'<br />';
        }
 
}
$instance = new ABC();
for($i =0; $i< 50 ; $i++){
     $instance->ddd();
}
?>

这是上面的代码在我的机器上面运行的结果:
Now memory_get_usage: 424312
Now memory_get_usage: 476408
Now memory_get_usage: 524408
Now memory_get_usage: 580608
Now memory_get_usage: 628608
Now memory_get_usage: 676608
Now memory_get_usage: 740992
Now memory_get_usage: 789000
Now memory_get_usage: 837000
Now memory_get_usage: 885000
Now memory_get_usage: 933000
Now memory_get_usage: 981000
Now memory_get_usage: 1029000
Now memory_get_usage: 1109768
Now memory_get_usage: 1157768
Now memory_get_usage: 1205768
Now memory_get_usage: 1253768
Now memory_get_usage: 1301768
Now memory_get_usage: 1349768
Now memory_get_usage: 1397768
Now memory_get_usage: 1445768
Now memory_get_usage: 1493768

<?php
class ABC{
    public $numBox = array();
    public function ddd(){
            for($i=1; $i<=600; $i++){
                    $this->numBox[] = mt_rand(1,1000000);
           }
                echo 'Now memory_get_usage: '.memory_get_usage().'<br />';
        }
 
}

for($i =0; $i< 50 ; $i++){
     $instance = new ABC();
     $instance->ddd();
}
?>

这个是上面的代码运行的结果:
Now memory_get_usage: 424552
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536
Now memory_get_usage: 424536

OK,其实,只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间,每次重新分配内存一定是要占用更多的内存的,所以,我们要对的类的实例化要注意,这样也就是为什么要使用单实例设计模式,因为这样可以节约内存。
看到这个结果我也感到很意外,每次实例化的去执行时,反而占用内存少,而只实例化一次反而使用内存多,不知道是为什么,有待高手解答。

原文:http://yi1.com.cn/posts/587

关于vm虚拟机安装好之后,没有IP的问题解决

2条评论

2012 年 01 月 05 日 at 上午 11:25分类:Linux

这个时候就需要去修改这个问题了:
/etc/sysconfig/network-scripts/ifcfg-etho这个文件了
简单的话,加上如下内容:

IPADDR='192.168.214.133'
BOOTPROTO='dhcp'
ONBOOT='yes'

然后重启下network就行了

# /etc/rc.d/init.d/network restart

完整的ifcfg-eth0文件的内容如下:

DEVICE=name,这里name是物理设备的名字(动态分配的PPP设备应当除外,它的名字是“逻辑名”。
IPADDR=addr, 这里addr是IP地址。
NETMASK=mask, 这里mask是网络掩码。
NETWORK=addr, 这里addr是网络地址。
BROADCAST=addr, 这里addr是广播地址。
GATEWAY=addr, 这里addr是网关地址。
ONBOOT=answer, 这里answer取下列值之一:yes -- 该设备将在boot时被激活。no -- 该设备不在boot时激活。
USERCTL=answer, 这里answer取下列值之一: yes --非root用户可以控制该设备. no -- 非root用户不允许控制该设备。
BOOTPROTO=proto, 这里proto取下列值之一:none -- 不使用boot时协议。bootp -- 使用bootp协议。dhcp --使用dhcp协议。