📝谈谈你对 JS 内存泄漏与内存溢出的理解
-
内存泄漏(Memory Leak)指的是程序不需要使用的内存没有被正确释放,从而导致内存占用逐渐增加,最终可能会耗尽所有可用内存。
内存泄漏即不想用的内存没被释放
-
内存溢出(Memory Overflow)指的是程序请求的内存超出了系统所能提供的最大限制。
内存溢出即想要申请内存却不足够
-
内存泄漏场景
-
全局变量的使用会导致内存泄漏。全局变量指的是未使用
var
、let
、const
声明的变量,其在整个应用程序的生命周期中始终存在。 -
闭包也会导致内存泄漏。闭包变量引用闭包,闭包引用其词法作用域中的变量。只要闭包变量不为 null,其相关的引用全部无法被垃圾回收。
-
DOM 操作可能会导致内存泄漏。如果 JS 变量存储着对 DOM 元素的引用,当对应的 DOM 元素从 document 中移除后,对应变量仍存在着对应的引用,而不是被回收。
1
2
3const element = document.getElementById("leakyElement");
document.body.removeChild(element);
// 但 element 仍然在 JavaScript 代码中被引 -
未清理的定时器也可能会导致内存泄漏。
-
-
内存溢出场景
- 递归调用。无限制或深度过大的递归调用可能会导致调用栈溢出。
- 大数据操作。一次性分配或处理过大的数据量可能导致内存不足。
- 死循环。在循环中不断地分配内存或生成数据,而没有合适的退出条件。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 川一土的博客视界!
评论