内存缓存机制and垃圾回收机制
一、内存缓存机制
var_dump(memory_get_usage(true));
$a="laruence";
var_dump(memory_get_usage(true));
unset($a);
var_dump(memory_get_usage(true));
1.加上true之后,显示的三个相等的数代表php申请的内存大小,无论你是空着还是向里面存数据,都显示php申请的内存,当你存储的数据过大时,php会再申请一块新的内存进行扩充,这样就避免了php经常性的调用内存。
2.所有php内存缓存机制是:php不是每次定义一个数据就申请一次内存,而是预先申请一块内存,当存储数据不够时,再次申请一块内存扩充
3.
//$a="hello";
//1.存储的变量名,存在符号表里。
//2.变量值存储在内存空间
//3.在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小
4.例如:
var_dump(memory_get_usage());
for($i=0;$i<100;$i++)
{
$a="test".$i;
$$a="hello";
}
var_dump(memory_get_usage());
for($i=0;$i<100;$i++)
{
$a="test".$i;
unset($$a);
}
var_dump(memory_get_usage());
二、垃圾回收机制
1.
//php变量存储是存储在一个zval容器里面的
//zval大体分为四块
//1.类型 2.变量值 3.is_ref 布尔型代表是否有地址引用 4.refcount 指向该值得变量的个数
2.例如
//1.变量赋值的时候:is_ref为false refcount为1
$a=1;
xdebug_debug_zval('a');
echo PHP_EOL; //2.将变量a的值赋变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候
$b=$a;
xdebug_debug_zval('a');
echo PHP_EOL; //3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去(b不指向a了,但是c又指向a了) $c=&$a;
xdebug_debug_zval('a');
echo PHP_EOL; xdebug_debug_zval('b');
echo PHP_EOL;
3.
//垃圾回收:
//1.在5.2版本之前,php会根据refcunt值来判断是不是垃圾
//如果refcount值为0,php会当做垃圾释放掉
//这种回收机制有缺陷,对于环装引用的变量无法回收
//环状引用
$attr=array("hello");
$attr[]=&$attr; xdebug_debug_zval("attr");
echo PHP_EOL;
//2.在5.3之后版本改进了垃圾回收机制
//如果发现一个zval容器中的refcount在增加,说明不是垃圾
//如果发现zval容器中的refcount在减少,如果减少到0,直接当做垃圾回收
//如果发现zval容器中的refcount在减少,并没有减少到0,php会把该值放到缓冲区,当做有可能是垃圾的怀疑对象。
//当缓冲区达到临界值,php会自动调用一个方法去遍历每一个值,如果发现是垃圾就清理
内存缓存机制and垃圾回收机制的更多相关文章
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- JVM内存管理机制和垃圾回收机制
JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...
- JVM的内存区域划分以及垃圾回收机制详解
在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...
- php内存管理机制、垃圾回收机制
一.内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = ...
- php内存管理机制与垃圾回收机制
PHP内存管理机制 1 var_dump(memory_get_usage()); //获取内存 2 $a = "laruence"; //定义一个变量 3 var_dump(me ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- Java精选笔记_面向对象(包、访问控制、内存机制、垃圾回收机制)
包 包的定义与使用 专门用来存放类的,通常功能相同的类存放在相同的包中. 包的声明只能位于Java源文件的第一行 Java语言中的常用包 java.lang:包含Java语言的核心类,如String. ...
- JS 从内存空间谈到垃圾回收机制
壹 ❀ 引 从事计算机相关技术工作的同学,对于内存空间相关概念多少有所耳闻,毕竟像我这种非计算机科班出身的人,对于栈堆,垃圾回收都能简单说道几句:当我明白JS 基本类型与引用类型数据存储方式不同,才 ...
- JDK8新垃圾回收机制--G1垃圾回收机制
G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性.例如,G1的主要输入参数是初始化和最大Java堆大小.最大GC中断时间. G1 GC由Y ...
随机推荐
- 在DataGridView控件中加入ComboBox下拉列表框的实现
在DataGridView控件中加入ComboBox下拉列表框的实现 转自:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.htm ...
- Linux 的cp命令
Linux 的cp命令 功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若 ...
- java-常见异常
一.运行时异常 1.空指针(java.lang.NullPointerException) 2.类型转换() 3.数组下标越界(java.lang.ArrayIndexOutOfBoundsExcep ...
- Hadoop_初识
一. 什么是Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序. 充分利用集群的威力进行高速运算和存储. Hado ...
- House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- javascrpt 中的Ajax请求
回顾下javascript中的Ajax请求,写一个小例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- C++重载operator的示例
#include<iostream>#include<vector>using namespace std; class test{public: int v; / ...
- Lambda表达式动态拼接(备忘)
EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...
- vue 倒计时
简单粗暴 export default { data () { return { timer: 30, //默认倒数30秒 stop : false, //默认是停止的,但界面加载之后会变成false ...
- 西部数据出现“WD SES Device USB Device”怎么办,而且说明书全是英文。
您好.wd ses device driver这个驱动程序可以在baidu中输入关键词找到,什么驱动之家.驱动人生之类的专业驱动网站也都是有的. western digital的移动硬盘驱动程序安装步 ...