<?php$t = memory_get_usage();
// 3125000$i = 1;
$a[$i] = $i;$i = 1111111111;
$a[$i] = $i;$i = '1';
$a[$i] = $i;$i = '111111111111111111111111111';
$a[$i] = $i;
echo memory_get_usage()-$t;?>请问如何计算出各个占用了多少内存的。谢谢各位拉。

解决方案 »

  1.   

    我都有每次输出看的了。
    像字符串的那个,111111111111111111111111111的比上面1用的内存多。
    不知为何。就不知道php是怎么分配的啊。
      

  2.   

    php是基于c的,内存管理是不面向php的。
    这种问题你要参考laruence大牛怎么说的。http://www.laruence.com/2011/03/04/1894.htmlhttp://www.laruence.com/2011/11/09/2277.html
      

  3.   

    你应该用memory_get_usage(TRUE)比较,如果都换成TRUE,我估计输出都是一样的本质上,php有自己的内存管理机制,这样的需求就要求申请的时候,需要更大块内存然后有一套自己应对内存管理结构,减少系统调用次数
      

  4.   

    不同意,laruence的文章衍伸出去有许多知识点。当我们调用emalloc申请内存的时候, PHP并不是简单的向OS要内存, 而是会像OS要一个大块的内存, 然后把其中的一块分配给申请者, 这样当再有逻辑来申请内存的时候, 就不再需要向OS申请内存了, 避免了频繁的系统调用.
    ==================================================================================
    光这句话就说明很多问题了。系统调用还是个专业词,得理解什么是系统调用,进程的用户态,内核态。为什么频繁的系统调用需要避免。同样的, 在我们调用efree释放内存的时候, PHP也不会把内存还给OS, 而会把这块内存, 归入自己维护的空闲内存列表. 而对于小块内存来说, 更可能的是, 把它放到内存缓存列表中去(后记, 某些版本的PHP, 比如我验证过的PHP5.2.4, 5.2.6, 5.2.8, 在调用get_memory_usage()的时候, 不会减去内存缓存列表中的可用内存块大小, 导致看起来, unset以后内存不变, 见评论).
    ===============================================================================
    memory_get_usage()并不能真实得到内存分配量。我当初看这些东西也是云山雾罩的,多晕几次就慢慢懂点东西了。
      

  5.   

    我指的不是如何去申请内存的问题,而是他没有说明 php 是如何维护变量表的。
    而 php 的变量应该是一个结构队列,每个每一项都应至少包括:变量名称、类型、值指针、是否是引用....
    这才是我们需要关心的,而他是如何维护这张表的。却不是很重要
      

  6.   

    了解了,关于变量下面两篇laruence文章有提到,特别是第二篇,个人觉得很好,真心建议坛友们多看看,估计很多人都看过了,挺出名的,再结合php官方那篇垃圾回收机制的文章,效果更好。
    变量存储
    http://www.laruence.com/2008/08/22/412.html
    变量分离引用
    http://www.laruence.com/2008/09/19/520.htmllaruence现在已经是php开发组成员了,说不定以后某个版本的php的某个特性就是他实现的,他说的东西还是比较权威的。
      

  7.   

    谢谢楼上各位大哥。
    sina云什么有时候真慢。大半天打不开。
    我还在折腾那排序。昨晚又搞到3点多=_=
    想用php位图来排序,但耗太大内存。
    现在想方法优化。晚点再贴代码上来。
      

  8.   

    laruence是去了php 核心開發的中國人吧