函数内存分析|学习笔记

简介: 快速学习函数内存分析

开发者学堂课程【PHP 基础入门课程(下)函数内存分析】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/710/detail/12624


函数内存分析


内容介绍:

一、目标

二、概念

三、具体步骤

四、示例

五、结果分析

六、小结


一、目标

了解函数在内存中的运行原理。


二、概念

(1)函数运行的前提: 当前函数已经在内存中存在。运行就是调运,要把它加载在内存中才能使用。

(2)函数不会自动运行。

(3)函数运行是在战栈区开辟内存运行。和内存有相应的关系。

(4)函数运行结束会自动释放所占用内存。使用结束系统会把当前加载的内存运行进行释放,就是释放栈区里的内存。


三、具体步骤:

1、脚本编译: 将代码加载到内存中。

虽然是一种解释性语言,但也要进行一种编译,即时编译。将代码加载到内存中时,也要进行一种语法的解析,语法的检查。例如是否规范,是否写错

逻辑如下:

(1)代码被读取。要读到内存,这是因为代码写在文件中,文件不能执行,所以要读到内存中。

(2)代码被编译: 语法出错会报错。结果是将别以后的代码装在代码段,专门放代码的内存。

(3)所有代码被加载到内存中。

2、代码执行

(1)代码顺序逐行执行。顺序执行三大结构。

(2)函数结构不会被执行(跳过)。认为函数结构不这么用。

3、函数执行  (函数名+())

(1)在内存中寻找函数名对应的函数是否存在

不存在: 报错

存在: 继续

编译时所有的函数代码都存在,所以继续进行。

如果找不到就会报错。

(2)在栈区开辟内存加载函数

参数处理

函数体执行

(3)函数执行结束

占用内存释放(栈区内存)这里不能释放代码段。

回到函数调用处

4、脚本执行结束: 释放所有内存

(包括存放代码的代码段)即占用内存被全部释放。


四、示例

利用此原理进行代码的解析。

#先调用函数

he11o();

wor1d():

#后定义函数

同变 function hello(){

echo'hello';

系统看到此会认为是函数调用,

#先调用函数

he11o();

wor1d():

这段代码开始从上至下进行运行。系统提示运行错误,提示没有此函数。

image.png

接下来定义函数,进行输出,

#后定义函数

function hello(){

echo'hello';

此时 hello 代表函数的名字,运行代码,刷新可以看到输出 hello,

image.png

出错的问题在 world 函数。此时分析问题所在,首先将代码读入到内存,请求时把整个脚本的代码加载至内存,执行代码。首先,执行 hello,找到 function 进行执行,最后回到调用处,并且释放掉内存。执行第二行 world,在内存中找不到对应的函数,因为对应的脚本中没有此函数,此时报错,产生结果。所以 hello 被正常输出,而 World 报错,最后执行至最后一行。理论上报错后不再进行,假设没有进行报错,剩下的代码也不会执行,因为这是一种结构,系统会直接跳过,直至结束,同时释放所有占用的内存。而重新换一个脚本也不会被调用,因为脚本中没有此函数。


五、结果分析

1、代码编译: 函数 hello 被加载到内存

2、执行代码

Hello()执行: 发现内存中有: 执行,输出 hello

World()执行: 发现内存中没有: 报错


六、小结

1、函数运行的前提是内存中已经存在该函数。将函数定义好,将对应的文件加载至内存才能运行,调用。

2,函数运行与定义的顺序没有先后顺序(建议先定义,后运行)

3、函数的执行是在栈区运行(效率高)比较少。

4、函数运行完就会释放自己所占用的内存。如果在内存中定义了一些变量,变量放入栈内,在函数运行完之后,变量也会被释放。

5、Php 脚本运行结束会释放所有内存。无论数据还是代码,都会被释放。保证 php 脚本占用内存少。

相关文章
|
10月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
11月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
95 3
|
3月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
234 3
|
2月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
132 4
AI代理内存消耗过大?9种优化策略对比分析
|
2月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
231 15
|
11月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
178 1
|
6月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
6月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
125 2
|
10月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
318 62

热门文章

最新文章