一、内存缓存机制

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垃圾回收机制的更多相关文章

  1. JVM内存管理和JVM垃圾回收机制

    JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...

  2. JVM内存管理机制和垃圾回收机制

    JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...

  3. JVM的内存区域划分以及垃圾回收机制详解

    在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...

  4. php内存管理机制、垃圾回收机制

    一.内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = ...

  5. php内存管理机制与垃圾回收机制

    PHP内存管理机制 1 var_dump(memory_get_usage()); //获取内存 2 $a = "laruence"; //定义一个变量 3 var_dump(me ...

  6. JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  7. Java精选笔记_面向对象(包、访问控制、内存机制、垃圾回收机制)

    包 包的定义与使用 专门用来存放类的,通常功能相同的类存放在相同的包中. 包的声明只能位于Java源文件的第一行 Java语言中的常用包 java.lang:包含Java语言的核心类,如String. ...

  8. JS 从内存空间谈到垃圾回收机制

     壹 ❀ 引 从事计算机相关技术工作的同学,对于内存空间相关概念多少有所耳闻,毕竟像我这种非计算机科班出身的人,对于栈堆,垃圾回收都能简单说道几句:当我明白JS 基本类型与引用类型数据存储方式不同,才 ...

  9. JDK8新垃圾回收机制--G1垃圾回收机制

    G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性.例如,G1的主要输入参数是初始化和最大Java堆大小.最大GC中断时间. G1 GC由Y ...

随机推荐

  1. GO语言练习:for基本用法

    1.代码 2.运行 1.代码 package main import "fmt" func main(){ ; k < ; k++{ JLoop: ; j < ; j+ ...

  2. python 之select

    服务端源码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @author: zengchunyun "& ...

  3. String之“==”与equals

    有时候String类型用“==”判断相等时无法成功,经过实验,用string.equals方法可以判断成功!! for (int i = 0; i < 10000; i++) {   Strin ...

  4. sencha做个简单的登录界面

    很多人都在群里问要一个好看的登录界面,我表示很无奈,哪有好看的,每个人的要求不一样,要好看的只有自己做. 下面是我自己整理的一个通用版的登录界面,稍做修改,很容易能变成你想要的界面, 不说废话,直接上 ...

  5. Ubuntu FTP 配置

    1. apt-get install vsftpd 2. vim /etc/vsftp.conf #禁止匿名访问 anonymous_enable=NO #接受本地用户 local_enable=YE ...

  6. scala case class

    在我们详细介绍Scala的Case class和模式匹配之前,我们可以通过一个简单的例子来说明一些基本概念.我们设计一个函数库,这个函数库可以用来计算算术表达式,为简单起见,我们设计的算术表达式只侧重 ...

  7. 日历js插件

    因为做了一个培训管理模块,要有一个开始与结束培训时间.时间日期如果个用户手动输入的话,即使你要求了时间格式,但是用户可能还是会输错时间格式.所以想想,还是找了一个js日历插件.下面来介绍下我自己用的一 ...

  8. SQL Server 存储过程(转)

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  9. Kinect 骨骼追踪对象选择

    默认情况下,骨骼追踪引擎会对视野内的所有活动的游戏者进行追踪.但只会选择两个可能的游戏者产生骨骼数据,大多数情况下,这个选择过程不确定.如果要自己选择追踪对象,需要使用AppChoosesSkelet ...

  10. shutter截图工具

    安装: 1.打开ubuntu software center,搜索shutter,安装. 使用: