PHP笔记 变量和内存管理

鸟哥的博客是个大宝库,正在从头看起。

《深入理解PHP内存管理之谁动了我的内存》

http://www.laruence.com/2011/03/04/1894.html

1、memory_get_usage 函数

int memory_get_usage ([ bool $real_usage = false ] )

PHP脚本使用的内存(不含 memory_get_usage() 函数本身占用的内存)

memory_get_usage()的参数$real_usage,默认为 FALSE;当设置为 TRUE 时,得到的内存值为PHP 内存管理占用的内存。

//php分配到的内存
var_dump(memory_get_usage(true));
//php使用内内存
var_dump(memory_get_usage());

结果

int 262144
int 239368

PHP的内存管理机制是:预先分配一块空间,用来存储变量,当空间不够时,再申请一块新的空间。

memory_get_usage(true)即为预先分配的内存。

之前没有注意过PHP页面的内存使用,以后优化页面时候也应该用这个函数来分析代码。

2、变量赋值和内存

var_dump(memory_get_usage());

$a = "Hello World";
var_dump(memory_get_usage());

$b = $a;
var_dump(memory_get_usage());

unset($b);
var_dump(memory_get_usage());

unset($a);
var_dump(memory_get_usage());

结果

int 239776
int 239912
int 240000
int 239912
int 239776

239912-239776=136

240000-239912=88

$a和$b赋值所使用的内存不同,原因是$b赋值并没有分配内存,这88个字节是输出函数占用的。

另外销毁$b,并不影响$a使用的内存,这个是内存管理引用计数的原因

改一下例子就能很清楚的了解变量赋值和内存的关系

var_dump(memory_get_usage());

$a = "Hello World";
var_dump(memory_get_usage());

$b = "Hello World";
var_dump(memory_get_usage());

unset($b);
var_dump(memory_get_usage());

unset($a);
var_dump(memory_get_usage());

结果

int 239816
int 239952
int 240088
int 239952
int 239816

239952-239816=136

240088-239952=136

另外引用赋值占用内存规则和直接赋值相似,这也涉及到内存管理的引用计数规则

3、php垃圾回收机制,这部分了解的还不够深入,简单记录一个函数

xdebug_debug_zval 需要安装xdebug扩展

$a = "Hello World";
xdebug_debug_zval(‘a‘);

输出

a:

(refcount=1, is_ref=0),string ‘Hello World‘ (length=11)

refcount 指向该值的变量数量

is_ref 代表是否有地址引用

类型

变量赋值的时候:is_ref为false  refcount为1

手册地址

引用计数的基本知识

http://php.net/manual/zh/features.gc.refcounting-basics.php

每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference

set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过浏览器请求的的脚本)和每个函数或者方法也都有作用域。

以上翻看鸟哥的11年的blog文章,对PHP的变量和内存管理有了一个初步的认识。

时间: 2024-11-13 12:47:26

PHP笔记 变量和内存管理的相关文章

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt

block没那么难(二):block和变量的内存管理

本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着来聊聊 block 和变量的内存管理.本文将介绍可写变量.block的内存段.__block变量的内存段等内容,看完本文会对 block 和变量的内存管理有更加清晰的认识. 上篇文章举了个例子,在 block 内获取了一个外部的局部变量,可以读取,但无法进行写入的修改操作.在 C 语言中有三种类型的变量,可在

IOS开发—block对外部变量的内存管理

block对外部变量的内存管理 代码块在ios中通常用于回调,本文主要介绍block对外部变量的管理机制.我们知道如果要在block中使用block外面的变量,如果该变量是局部变量,就要先将其申明为__block类型.为什么呢?这就涉及到block对外部变量的内存管理. 一.基本数据类型 先看下面测试代码: //局部变量 - (void)localDataTest { int localData = 100; NSLog(@"localData --%p",&localData

【cocos2d-x 3.x 学习笔记】对象内存管理

内存管理 内存管理一直是一个不易处理的问题,开发者必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完毕后有效地释放内存,即管理对象的生命周期.由于C++是一个较为底层的语言,其设计上不包含任何智能管理内存的机制.一个对象在使用完毕后必须被回收,然而在复杂的程序中,对象所有权在不同程序片段间传递或共享,使得确定回收的时机十分困难,因此内存管理成为了程序员十分头疼的问题. 另一方面,过于零散的对象分配回收可能导致堆中的内存碎片化,降低内存的

effective OC2.0 52阅读笔记(五 内存管理)

第五章:内存管理 29 理解引用计数 30 以ARC简化引用计数 总结:ARC通过命名约定将内存管理规则标准化.其他编程语言很少像OC这样强调命名.ARC通过设置全局数据结构(此数据结构的具体内容因处理器而异)中的一个标志位,来代替直接调用autorelease和retain.这是ARC所带来的好处.待编译器与运行期组件日臻成熟,还会出现其他的优化技术.CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease. 31 在dealloc方法中只释放引用

IOS学习笔记--Objective-C之内存管理

2014-07-26 17:10 by KenshinCui, 17317 阅读, 6 评论, 收藏, 编辑 概述 我们知 道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管 理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问 题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维

操作系统、编程语言分类、变量、内存管理、定义变量

1,什么是操作系统 操作系统就是软件与硬件之间的一个操作程序. 2.为什么要有操作系统 (1)控制硬件 (2)把控制硬件的接口做成一个完美的接口,供用户使用. 3.操作系统的三大组成 应用程序 : 操作系统  :比如windows, Linux 计算机硬件 4.编程语言的分类 (1)机械语言 (2)汇编语言 (3)高级语言:分为编译型C.解释型python 5.执行python的两种程序 <1>交互式 优点:调试程序 缺点:无法保存代码 <2>命令行的方式:永久保存代码  pyth

操作系统,编程语言分类,执行python两种方式,变量,内存管理,定义变量的三个特征

操作系统 1.什么是操作系统 操作系统位于计算机硬件与应用软件之间 是一个协调.管理.控制计算机硬件资源与软件资源的控制程序 2.为何要有操作系统? 1.控制硬件 2.把对硬件的复杂的操作封装成优美简单的接口(文件),给用户或者应用程序去使用 注意:一套完整的计算机系统包含三部分 应用程序:qq,暴风影音,快播 操作系统:windows,linux,unix 计算机硬件 强调: 我们以后开发的都是应用程序 应用程序无法直接操作硬件,但凡要操作硬件,都是调用操作系统的接口 编程语言分类 1.机器语

python-面试常用 --变量、内存管理(小整数池,引用计数)

执行Python程序的两种方法 第一种:交互式(jupyter就是对这种进行了封装) 优点:直接给出结果 缺点:无法保存 第二种:命令行式,通过Python解释器输入文本(pycharm对这种进行了封装) 优点:可以保存 缺点:无法及时得到报错反馈 命令行式可以识别任何文本文件,例如:.txt文件..py文件. 命令行式打开的三个步骤 编写Python文件 找到Python文件的路径,把文本从硬盘中读入内存 在内存运行并进行解释(这个时候才会有Python语法的概念,才会打印) 变量 什么是变量