内存管理

  1. 内存管理的生命周期
    1. 分配你所需要的内存
    2. 使用分配到的内存(读、写)
    3. 不需要时将其释放\归还
  2. 什么是内存泄漏?
    1. 不再用到的内存没有及时释放,就叫做内存泄漏。
    2. 不及时释放不再用到的内存的话,内存占用越来越高,影响系统性能甚至导致崩溃。
  3. 释放内存分为手动释放和自动释放。
    1. 手动释放:比如 C 语言,用 malloc 申请内存,用 free 释放内存,程序员进行内存管理。
    2. 自动释放:大多数语言提供自动内存管理,也叫做“垃圾回收机制(GC)”。
  4. 垃圾回收机制:
    1. 垃圾回收算法主要依赖于引用的概念。在内存管理的环境中,一个对象如果有访问另一个对象的权限(隐式或者显式),叫做一个对象引用另一个对象。
    2. 引用计数垃圾收集,此算法无法处理循环引用。
    3. 标记-清除算法,此算法的限制是,那些无法从根对象查询到的对象都将被清除。
    4. 从 2012 年起,所有现代浏览器都使用了标记-清除垃圾回收算法。
  5. 有了 GC 后,程序员就解放了?
    1. 不一定,对于很占空间的值,如果不再用到,需要检查是否对它们还有引用,如果是就要手动解除引用。
  6. 怎么识别内存泄漏?
    1. 如果连续五次垃圾回收后,内存占用一次比一次大,就有内存泄漏。
    2. Chrome 的 Timeline Performance 面板:如果内存占用基本平稳,说明不存在内存泄漏,反之则是内存泄漏
    3. 命令行 process.messageUsage 返回包含内存占用信息的对象:判断内存泄漏以信息里的 heapUsed 为准
  7. ES6 的 WeakMap
    1. 在新建引用的时候就声明,哪些引用必须手动清除,哪些引用可以忽略不计,当其他引用消失以后,垃圾回收机制就可以释放内存。这样就能大大减轻程序员的负担,你只要清除主要引用就可以了。
    2. ES6 考虑到了这一点,推出了两种新的数据结构:WeakSet 和 WeakMap。它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个”Weak”,表示这是弱引用。

这里看一个内存泄漏的例子

参考:

JavaScript 内存泄漏教程
js 晋级篇——前端内存泄漏探讨
内存管理
JavaScript 是如何工作的:内存管理 + 如何处理 4 个常见的内存泄露
Example 2: Watching the GC work.
堆内存(heap)和栈内存(stack)区别
JavaScript 中内存使用规则–堆和栈
前端基础进阶:详细图解 JavaScript 内存空间
JavaScript 变量——栈内存 or 堆内存

文中图片可能来自网络,侵删

Leave a comment