闭包真的还会造成内存泄露吗?你不知道的闭包与垃圾回收!
文章目录
- 前言
- 一、闭包是什么?
- 二、闭包有什么好处和坏处呢?
- 1.好处
- 2.坏处
- 二、闭包会造成内存泄露吗?
- 1.前言
- 2.闭包会造成内存泄露吗,如果会为什么还会再react hooks中大量使用呢?
- 三、为什么ie8及之前会造成内存泄露?
- 1.为什么会造成内存泄露
- 2.引用计数的缺陷
- 3.为什么ie8及之前还会存在引用计数呢?
- 总结
前言
相信大家在学习前端的路上都有接触到过闭包这个东西,并且这也是面试中的常客。那么闭包究竟是个什么呢?让我们一起来看看吧。
一、闭包是什么?
函数内部的变量不会影响到外部作用域,并且父函数返回的子函数可以访问到其父函数作用域的变量。
换句通俗的话说呢,就是一个作用域能访问另一个作用域的变量,且局部变量会常驻在内存中不会被回收。
二、闭包有什么好处和坏处呢?
1.好处
1.可以让外部函数访问内部变量。
2.能将局部变量存储在内存中达到重复使用。
3.可以避免使用全局变量造成全局污染。
2.坏处
会造成内存泄露(此处并不是绝对的,下面我将详细探讨闭包的内存泄露问题)
二、闭包会造成内存泄露吗?
1.前言
之前因为自己没有去实践过,所以看到网上说闭包会造成内存泄露,也就这么认为了。
在我学习了react hooks之后,我发现hook里面的useState就是利用闭包来实现每次渲染保持变量不变的,当时我就在想,如果闭包会造成内存泄露,那么react hooks里面不就会使用大量的闭包吗?这样的话性能也太差了吧?带着疑问,我查阅了书籍还有资料,发现了这个问题。
2.闭包会造成内存泄露吗,如果会为什么还会再react hooks中大量使用呢?
首先,闭包会造成内存泄露!!!但是只在ie8及之前会造成内存泄露。
现在的闭包已经不会造成内存泄露了。
三、为什么ie8及之前会造成内存泄露?
如果要探讨内存泄露这个问题,首先我们得先搞清楚,为什么会造成内存泄漏?
1.为什么会造成内存泄露
这一点得从垃圾回收机制说起,感兴趣的朋友可以去看我的另一篇专门讲垃圾回收机制的博客。
带你探索垃圾回收
首先,我们知道现在最常用的垃圾回收策略是标记清除,但在最早的时候,我们是使用引用计数来作为我们的垃圾回收策略的,但因为引用计数存在一些问题,所以被弃用了,但是,内存泄漏就是由引用计数造成的!!!!
2.引用计数的缺陷
引用计数的大概思路就是给声明变量赋给一个引用值,如果值被赋给另一个变量就+1,如果被覆盖就-1,当引用数为0时,就会释放这个值的内存。
引用计数存在了一个很严重的问题,循环引用。
循环引用的意思就是对象A有一个指针指向对象B,而对象B也引用了对象A,比如:
function problem() {let objA = new Object()let objB = new Object()ObjA.test1 = objBobjB.test2 = objA}
这个例子中,objA和objB通过各自的属性相互引用,导致引用数都是2.,在引用计数下,他们引用数永远不会到达0,如果函数被多次调用,则会导致大量内存永远不会被释放,从而造成内存泄露!
3.为什么ie8及之前还会存在引用计数呢?
在ie8及更早的版本中,并非所有对象都是原生js对象。BOM和DOM中的对象是C++实现的组件对象模型对象,简称COM对象。
COM对象是使用引用计数实现垃圾回收的,所以,即使这些版本的ie已经使用标记清除,但js存取的COM对象依旧是使用引用计数的。所以只要涉及到了COM对象,那么就会遇到循环引用的问题,比如:
let box = document.querySelector('.box')let obj = new Object()obj.box = boxbox.obj = obj
在这个例子里,DOM对象和原生js对象之间造成了循环引用,所以DOM元素的内存永远不会被清除。从而造成内存泄漏
总结
在ie9之后已经全面改成了js对象啦,这避免了由于存在两套垃圾回收算法而导致的问题,还解决了内存泄露现象!
现在我们可以愉快的使用闭包啦!
闭包真的还会造成内存泄露吗?你不知道的闭包与垃圾回收!相关推荐
- 搞不定 NodeJS 内存泄漏?先从了解垃圾回收开始
通常来说,内存管理有两种方式,一种是手动管理,一种是自动管理. 手动管理需要开发者自己管理内存,什么时候申请内存空间,什么时候释放都需要小心处理,否则容易形成内存泄漏和指针乱飞的局面.C 语言开发是典 ...
- 既然有 GC 机制,为什么还会有内存泄露的情况
理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被广泛使用于服务器端编程的一个重要原因). 然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被 GC 回收 ...
- js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏
js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...
- Java内存体系结构(模型),垃圾回收和内存泄漏
Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在每种世代类型之间分配允许 ...
- 015、JVM实战总结:大厂面试题:什么情况下JVM内存中的一个对象会被垃圾回收?
1.什么时候会触发垃圾回收? 新生代放不下了 2.被哪些变量引用的对象不能回收? 对象被方法的局部变量.类的静态变量给引用了,就不会回收他们. 可达性分析算法来判定哪些对象是可以被回收的.算法的思想: ...
- 什么情况下JVM内存中的一个对象会被垃圾回收
问题1: 哪些对象能回收,哪些对象不能被回收 1.引用计数算法 (ref count) 2.可达性算法 (root searching) JVM 使用可达性算法 判断哪些对象可以被回收.也 ...
- Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题
在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱. 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合 ...
- 说说JS在IE中的内存泄露问题
首先说说什么是内存泄露,在一个进程中,如果某一块内存无法访问,且直到进程结束为止也无法释放,那么就发生了内存泄露.通常这种情况发生在C++之类的手动管理内存的语言编写的程序中,程序员忘记delete或 ...
- android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...
最新文章
- 多索引表 (2)基本概念
- TEA加密算法的C/C++实现
- .NET C#使用微信公众号登录网站
- mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率
- python抓取贴吧_python抓取百度贴吧-校花吧,网页图片
- python可以读取excel文档吗_python打开excel文件【python读取excel文件如何进行】
- Eclipse开发环境下,部署和配置svn的整个过程
- 量化交易软件 python_我用Python做了个量化交易工具!
- 近期流行手机病毒“手机骷髅”解决方案
- 微信小程序【WXSS 文件编译错误】unexpected “?“at pos 1的解决办法。
- 李佳琦、薇娅们的残酷生存物语
- 机器学习-基础知识 - Precision, Recall, Sensitivity, Specificity, Accuracy, FNR, FPR, TPR, TNR, F1 Score
- Android打字机动画,Android自定义View实现打字机效果
- IPU VPU GPU的关系
- 年底谷歌扎堆升职,L3到L6升一级多$10w
- 了解代码管理系统Git相关产品
- 平面几何中的几个著名定理
- 图像分割:DeepLabV3与DeepLabV3+介绍
- MySQL数据库编程01
- Ableton Live 10 Suite v10.1.42 WiN-MAC 音乐制作宿主软件