闭包中的内存泄漏

news2024/10/7 12:19:11

一.闭包的内存泄漏

1.为什么有些AO对象就不会被销毁?

1)普通函数中

在这里插入图片描述
上述代码在执行foo函数的时候,内存中的过程。
在这里插入图片描述
执行完foo函数之后,foo的函数上下文被销毁了,那么就不会指向foo的AO对象了。
在这里插入图片描述
那么AO对象也会被销毁,但为什么在闭包中的有些这样的AO对象就不会被销毁呢?

2)在闭包中

因为闭包中能够在函数中返回函数,就比如return bar,所以就等于说有变量指向了这个函数对象,那么这个函数对象有了指向就不会被销毁,那么这个函数指向的对象也就不会被销毁。
因为没有对象指向它了,所以会被销毁,而在闭包中,即便函数上下文被销毁了,但是还有对象指向AO对象。

在这里插入图片描述
上述函数中,执行到第12行代码的时候,过程如下:
在这里插入图片描述
在执行到foo函数的最后的时候,return bar,其实就是return 0xb00,也就是将fn赋值为了0xb00,那么这个时候,bar对象就不会被销毁,bar对象不会被销毁,且bar对象还指向了foo函数的AO对象,也就是指向了上层作用域,那么这个AO对象也就不会被销毁。
但是如果没有了指向依旧会被销毁,执行最后一行代码的时候,实际上就是执行了bar函数,但是bar函数中就只有一个打印操作,只有bar函数的执行上下文指向bar函数的AO对象,当函数执行完毕之后,就没有东西指向bar函数的AO对象了,那么它的AO对象照样会被销毁。

2.闭包中的内存泄漏

如果在下面这段代码中,执行多次fn(),那么其实bar函数对象就一直没有被销毁,那么也就意味着它所指向的foo函数的AO对象也就一直没有被销毁,这样是没有问题的。
在这里插入图片描述
但是如果就只执行了一次fn(),那么原本就应该被销毁的foo函数的AO对象一直没有被销毁,一直占用内存,这个时候就出现了内存泄漏,就是说原本再也不会使用的东西,原本应该被销毁的,但是垃圾回收没有办法回收,因为仍然有指针指着它,这就是内存泄漏。
解决上述内存泄漏,其实只需要将fn=null ,就是fn 不指向了,那么这个AO的内存就会被释放,它和bar函数是互相指向的,但是按照GC最新的规则是会被回收的,它们就被销毁了。

二.闭包中AO对象不再使用的属性

这里有一段代码:
在这里插入图片描述
上述代码中调用了一次foo()函数,创建了一个AO对象和一个foo函数对象,如果在下面多次调用这个foo()函数且用一个变量来接收引用它,那么在内存中会创建多个foo函数对象和AO对象,它们是互不干扰的,如果把fn=null,是不会销毁其他的AO对象和foo函数对象的。
下面将到一个问题,就是在foo的AO对象中会定义两个属性,name和age,但是在实际使用的时候发现,只使用了name这个变量,age属性一直没有被使用。
在这里插入图片描述
虽然按照闭包的概念来讲,foo的AO对象不会被销毁,也就是说AO对象中的所有属性都不会被销毁,但是对于JS引擎的实现来说是十分灵活的,例如是V8引擎,为了提供性能,释放更多的空间,当发现上面的age属性永远不会使用的时候,是有必要将这个用不到的属性删除掉的,JS引擎基于优化这个角度,会将这个用不到的属性删除掉的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

格创东智蝉联入选工信部工业互联网APP优秀解决方案名单

1月13日,工信部发布《2022年工业互联网APP优秀解决方案名单公示》,由格创东智研发的 “基于深度学习技术的 AI智能检测(天枢AI)APP 应用解决方案”、“面向泛半导体行业的设备自动控制(EAP)APP解决方案”入…

一文详解SPI通信原理

首先我们先了解一下单工、半双工、全双工是什么概念 概念:(Serial Peripheral Interface,串行外设接口),是一种全双工协议的外设总线,同步串行通信 单工:电视 半双工:呼叫机 全双工:电话 SPI是单主设备(Single Master)通信协议&#xff…

商业智能 BI 赋能年底的财务分析

职场中总有些不能说的秘密,比如月底和年底的时候,千万不要去惹财务!尤其是年底,财务部门需要统计分析一整年的费用支出和经营收入,各种结算分析,还有新一年的预算,数据量庞大、业务系统分散、报…

【SpringCloud14】SpringCloud Bus消息总线

1.概述(对于Config的加深和扩充) 1.1 分布式自动刷新配置功能 SpringCloud Bus配合SpringCloud Config使用可以实现配置的动态刷新 Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和…

Web(八)

XML概念&#xff1a;Extensible Markup Language 可扩展标记语言可扩展&#xff1a;标签都是自定义的。 <user> <student>功能* 存储数据1. 配置文件2. 在网络中传输xml与html的区别1. xml标签都是自定义的&#xff0c;html标签是预定义。2. xml的语法严格&#xf…

使用 npm 包

小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用npm包有如下3个限制: ① 不支持 依赖于Node.js内置库 的包 ② 不支持 依赖于浏览器内置对象 的包 ③不支持 依赖于C插…

代码签名证书是如何进行验证工作的

代码签名证书是通过对代码的数字签名来标识软件来源以及软件开发者的真实身份&#xff0c;保证代码在签名之后不被恶意篡改。使用户在下载已经签名的代码时&#xff0c;能够有效的验证该代码的可信度&#xff1b;同时证书又分为个人型&#xff08;iv&#xff09;、企业型&#…

进程大杂烩

1、fork函数的使用 使用fork()函数创建一个进程 pid_t fork(void) fork函数调用成功&#xff0c;返回两次 返回为0&#xff0c; 代表当前进程是子进程 返回为正数&#xff0c;代表当前进程为父进程 fork()函数运行后会创建一个进程&#xff0c;加上开始的进程一共有两个进程&am…

第一天总结 之 用户管理界面的实现 之 模糊查询和分页操作

第一天总结 之 用户管理界面的实现 之 模糊查询和分页操作 1、明确页面的跳转 当登录操作执行时 如果正确 跳转到 UserFuzzySelectServlet 即用户模糊查询的select 注&#xff1a;因为第一次写项目 对于很多操作都不熟悉 很多前期操作没 有 按着 见名之意 …

迎兔年 贺新春 | vLive虚拟直播新年场景上线!

为了带来更为舒适的用户体验给用户提供更好的线上活动品质vLive虚拟直播2.3.1版本进行了优化升级还有多个新春场景上新全新升级的vLive又增添了哪些亮点一起来快速了解一下吧场景上新&#xff1a;新春活动更出彩农历新春降至如何让拜年视频更出众&#xff1f;如何让新年直播更精…

【C++】为什么C++会支持函数重载

文章目录 函数重载 1.概念 2.支持函数重载的原理 2.1准备知识 2.2原理 函数重载 1.概念 在C语言中&#xff0c;是不允许同名函数存在的。但是在一个作用域种&#xff0c;比如加法函数&#xff0c;想要实现各种类型的数据相加&#xff0c;要定义多个函数&#xff0c;但是…

设计模式-七大原则

设计模式 聚合 设计模式追求的是 1.代码重用性&#xff08;相同功能的代码不用重复编写&#xff09; 2.可读性&#xff08;规范性&#xff0c;便于其他程序员阅读和理解&#xff09; 3.可扩展性&#xff08;增加新的功能非常方便&#xff09; 4.可靠性&#xff08;增加新的…

【国产可编程逻辑控制器plc调研】

国产可编程逻辑控制器plc调研1 高性能PLC&#xff08;ACxxx系列&#xff09;2 中型PLC&#xff08;AMx00系列&#xff09;3 小型PLC&#xff08;HxU、HxS&#xff09;4 小型紧凑型PLC&#xff08;Easy&#xff09;[新品]总结由于有国产化的需求&#xff0c;所以调研了一家国内的…

Internet Download Manager2023下载器Win系统经典下载工具

IDM下载器是一款非常经典的多线程下载工具&#xff0c;广受国内外用户喜爱。该软件专注于文件下载&#xff0c;没有任何多余功能&#xff0c;也没有烦人的弹窗广告打扰&#xff0c;简单易操作。特别是站点抓取功能&#xff0c;对于网站整站下载非常的好用。 整站下载器有很多&…

shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问

应用场景&#xff1a;防止恶意IP尝试ssh登录 脚本说明&#xff1a;将密码输入错误超过四次得ip地址通过iptable防火墙访问。 分析&#xff1a; 首先&#xff0c;需要知道ssh远程访问记录在哪一个文件中 /var/log/secure其次&#xff0c;模拟远程访问输错密码&#xff0c;查…

数字化+智能化,低代码平台助力能源行业创新赋能

编者按&#xff1a;能源行业数字化转型需求发杂&#xff0c;定制化要求高&#xff0c;低代码平台对于能源行业来说可谓是“专业对口”。本文分析了能源行业数字化转型的痛点和需求&#xff0c;并进一步指出低代码平台的在能源行业中的应用价值&#xff0c;最后介绍了老牌低代码…

破解版IDM导致电脑反复闪屏的解决方案

破解版IDM导致电脑反复闪屏的解决方案 概括&#xff1a; 进入安全模式&#xff0c;卸载IDM&#xff0c;结束 文章目录破解版IDM导致电脑反复闪屏的解决方案问题原因解决方式&#xff1a;问题原因 在使用IDM(Internet Download Manager)的破解版下载文件时突然电脑闪屏&#…

分享5款开年必备的工具软件

最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧时间整理出几个好用的软件&#xff0c;希望可以帮到大家。 1. 影像处理——GIMP GIMP 提供了各种的影像处理工具&#xff0c;滤镜&#xff0c;还有许多的组件模块&#xff0c;对于要制作一个又酷又炫的网页按钮或网…

华为机试题:HJ15 求int型正整数在内存中存储时1的个数(python)

文章目录知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。2、print() &#xff1a;打印输出。3、int() &#xff1a;将一个字符串或数字转换为十进制整数&#xff08;强转&#xff09;。输入可以指定进制&#xff0c;…

JUC面试(二)——JUCJMMvolatile 2.0

JUC&JMM JMM 不保证原子性 各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。 这就可能存在一个线程AAA修改了共享变量X的值&#xff0c;但是还未写入主内存时&#xff0c;另外一个线程BBB又对主内存中同一共享变量…