通过代码看懂php内存分配机制,以及 unset 和 对内存的影响

2023-10-29 01:18

本文主要是介绍通过代码看懂php内存分配机制,以及 unset 和 对内存的影响,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面代码的运行环境,需要安装xdebug.so 才可以正常运行。


#!/usr/bin/env php
<?
#php中保存变量的内部表示结构体可以想像成struct zval{refcount=0,is_ref=0,data=''} 官方手册称之为变量容器
#-----------------------内存分配机制--------------------------
echo "\n";
echo "0--",memory_get_usage(),"\n";
$a = null;
xdebug_debug_zval('a');
echo "0--",memory_get_usage(),"\n";

输出:
0--391936
a: (refcount=1, is_ref=0)=NULL
0--392016


echo "\n";
echo "1--",memory_get_usage(),"\n";
#$a = '11111111111111111111111111111111111111111111111111';
$a = '11111111';
xdebug_debug_zval('a');
echo "2--",memory_get_usage();"\n";
#字符变量初次分配16b,之后每超1次增加8b
输出:
1--392016
a: (refcount=1, is_ref=0)='11111111'
1--392040


echo "\n\n";
echo "2--",memory_get_usage(),"\n";
$b = $a;#这里没有复制变量,只是将$b的zval指向了$a的zval
xdebug_debug_zval('a');
xdebug_debug_zval('b');
echo "2--",memory_get_usage(),"\n";

输出:
2--392040
a: (refcount=2, is_ref=0)='11111111'
b: (refcount=2, is_ref=0)='11111111'
2--392088


echo "\n";
echo "3--",memory_get_usage(),"\n";
$a = '';#对$a或$b任一引zval的变量赋值都会有新的zval生成,即生成新的内存空间。
xdebug_debug_zval('a');
xdebug_debug_zval('b');
echo "3--",memory_get_usage(),"\n";

输出:
3--392088
a: (refcount=1, is_ref=0)=''
b: (refcount=1, is_ref=0)='11111111'
3--392136

#----------------------unset和& 对内存的影响-----------------------
echo "\n";
echo "4--",memory_get_usage(),"\n";
$c=&$a;#使$c引用$a的val,并使此zval.refcount加1
xdebug_debug_zval('a');
xdebug_debug_zval('c');
echo "4--",memory_get_usage(),"\n";

输出:
4--392136
a: (refcount=2, is_ref=1)=''
c: (refcount=2, is_ref=1)=''
4--392184


echo "\n";
echo "5--",memory_get_usage(),"\n";
unset($c);#断开$c到zval的引用,并使zval.refcount-1,然后如果zval.refcount==0,直接清除zval释放内存
xdebug_debug_zval('a');
xdebug_debug_zval('c');
echo "5--",memory_get_usage(),"\n";

输出:
5--392184
a: (refcount=1, is_ref=0)=''
5--392136

echo "\n";
echo "6--",memory_get_usage(),"\n";
$a=null;#zval还是存在的只是清除了,数据类型占用的空间,如:这里只减了16b,上面首次分配16b
xdebug_debug_zval('a');
xdebug_debug_zval('b');
echo "6--",memory_get_usage(),"\n";

输出:
6--392136
a: (refcount=1, is_ref=0)=NULL
b: (refcount=1, is_ref=0)='11111111'
6--392120

这篇关于通过代码看懂php内存分配机制,以及 unset 和 对内存的影响的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297268

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存