内存机制
基本数据类型用 栈存储,引用数据类型用 堆存储
看起来没有错误,但实际上是有问题的。可以考虑一下闭包的情况,如果变量存在栈中,那函数调用完 栈顶空间销毁,闭包变量不就没了吗?
其实还是需要补充一句:
闭包变量是存在堆内存中的!!!
栈内存中变量一般在它的当前执行环境结束就会被销毁被垃圾回收制回收, 而堆内存中的变量则不会,因为不确定其他的地方是不是还有一些对它的引用。 堆内存中的变量只有在所有对它的引用都结束的时候才会被回收。
闭包中的变量并不保存中栈内存中,而是保存在堆内存中。 这也就解释了函数调用之后之后为什么闭包还能引用到函数内的变量
栈与堆内存
- js之所以能够在浏览器中运行,是因为浏览器给js提高了执行的环境,
(1)值类型(基本类型):数值(number)、布尔值(boolean)、null、undefined、string(在赋值传递中会以引用类型的方式来处理)。
(2)引用类型:对象、数组、函数。
- 对象(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function)
- 堆区:存储引用类型,引用数据类型存储在堆内存中,因为引用数据类型占据空间大、大小不固定
- 栈区: 局部变量和基本类型(null、undefined、布尔值、字符串、数值)
处理过内存泄露吗
内存泄漏是指不再需要的对象或数据没有被正确释放,导致未使用的内存随时间累积。这可能导致应用程序性能下降,并可能导致崩溃
内存泄漏的表现:
- 系统中的内存使用持续增长,并且不会释放。
- 长时间运行的应用程序表现出越来越慢的性能。
- 使用浏览器时,打开的页面消耗过多的内存。
分析问题:
-
1、浏览器开发者工具
devtool- 在 Performance 面板中,可以使用 Memory 或 Memory/Heap Snapshot 选项来进行内存分析。
- 可以进行堆快照,并查看快照中对象的引用关系,从而找到内存泄漏的根源
-
2、分析代码
- 通过审查代码,检查定时器、事件监听等,确保这些操作不会导致对象一直保持在内存中,没有被正确释放。
递归内存溢出,超过多少会内存溢出?
- 内存溢出通常发生在递归深度过大
- 当递归调用的深度超过堆栈大小时,就会引发堆栈溢出错误(stack overflow)
- 内存限制:超过了js引擎的内存限制就会导致内存栈溢出,例如,V8 引擎(用于 Chrome 和 Node.js)对单个进程的最大堆内存有特定限制。在 64 位系统上,默认情况下,V8 的最大堆内存限制大约为
1.5 GB到4 GB - 无限递归:会导致栈溢出
死循环为什么会导致内存溢出
死循环 => 会导致浏览器卡死
- js是单线程,循环一直在执行,一直无法退出,这个线程就会处于忙碌的状态,无法就处理后面的执行,就会导致内存溢出,阻塞线程
- 死循环不会导致内存溢出
- 死循环没有任何的内存占用
- 内存溢出只是针对栈内存和堆内存,也就是对象(存储在堆)和变量(存储在栈)