C、C++语言需要手动管理内存的分配与释放(常用方法:malloc(), calloc(), realloc()和free()等)。而JavaScript与Java、C#相似,内置了垃圾回收器,能自动管理内存的分配与释放。

内存生命周期

分配内存

使用分配的内存(读与写操作)

当应用程序不再需要时,释放掉已分配的内存


虽然垃圾回收器能能自动管理内存分配、释放,但并不意味着开发者不再需要关注内存管理。因为一些不好的编码会导致内存泄露,即应用程序不再需要的内存没有被释放掉。因此了解内存管理是很重要的。

Javascript中的内存分配

当声明变量时,JavaScript会自动为变量分配内存

var numberVar = 100; //为整数分配内存

var stringVar = 'node simplified';  // 为字符串分配内存

var objectVar = {a: 1}; // 为对象分配内存

var a = [1, null, 'abra']; // 为数组分配内存

function f(a) {

return a + 2;
} // 为函数分配内存

GC(Garbage collection)

引用计数算法是一种最基础的垃圾回收算法,当一个对象的引用数为零时,会被自动回收。该算法将一个对象的引用数为0时视为应用程序不再需要的内存。

!function (){

var o1 = {a: {b: 2}},// 两个对象被创建。假如分别用A:{a: {b: 2}},B:{b: 2}表示,对象B被对象A的属性a引用,对象A被赋值给变量o1。A和B的引用数都为1,因此不能被回收。
      o2 = o1; // 将对象A赋给变量o2。此时A引用数为2,B引用数1。
      o1 = 1;// 将变量o1对对象A引用切断。此时A引用数为1,B引用数1。
var oa = o2.a; // 将对象B赋值给变量oa。此时A引用数为1,B引用数2。
      o2 = 'foo'; // 将变量o2对对象A引用切断。此时A引用数为0,B引用数1。因为对象A的a属性被变量oa引用,因此对象A不能被释放。
      oa = null; // 将变量oa对对象B引用切断。此时A引用数为0,B引用数0。A与B会被回收。

}()

引用计数的限制:循环引用

循环引用存在一个限制。如下实例,两个对象相互引用,形成一个循环引用。正常情况下,当函数执行完后,对应的内存会被释放掉。而引用计数算法会将循环引用对象的引用数都视为至少为1,因此不能被回收。

function f() {

var o = {};

var o2 = {};

o.a = o2; // o references o2
  o2.a = o; // o2 references o
   return 'azerty';
}f();


常见问题

IE6-7的DOM对象是基于计数引用算法进行垃圾回收的。而循环引用通常会导致内存泄露:

var div;window.onload = function() {
  div = document.getElementById('myDivElement');                                  div.circularReference = div;

div.lotsOfData = new Array(10000).join('*');

};

DOM元素div通过自身的“circularReference”属性循环引用自己。如果没有显式将该属性删除或设为null,计数引用垃圾回收器会始终持有至少一个引用。即使DOM元素从DOM树种移除,DOM元素的内存会一直存在。如果DOM元素持有一些数据(如实例中“lotsData”属性),该数据对应的内存也无法被释放。

Mark-and-sweep algorithm(标记清除)

该算法将“对象不再需要”的定义简化为“对象不可到达”。 这个算法假设有一组被称为roots的对象(在JavaScript中,root就是全局对象)。垃圾回收器会定期地从这些roots开始,查找所有从根开始引用的对象,然后再查找这些对象引用的对象……。从roots开始,垃圾回收器会查找所有可到达对象,并回收不可到达的对象。

为了确定对象是否需要,该算法要确定对象是否可到达。由如下步骤组成:

垃圾回收器会创建一组roots,roots通常是持有引用的全局变量。在JavaScript中,window对象就可作为root的全局变量。

垃圾回收器会检查所有的roots并标记为活跃状态。然后递归遍历所有的子变量。只要从root不能到达的都被标记为垃圾。

所有没有被标记为活跃状态的内存块都被视为垃圾。垃圾回收器就可以释放这部分内存并把释放的内存返回给操作系统。


这个算法比引用计数算法更优,因为对于引用计数算法“零引用的对象”总是不可到达的,但反之则不一定,如循环引用。而标记清除算法不存在循环引用的问题。

截至2012年,所有现代浏览器都内置了标记清除垃圾回收器。在过去几年里所有对JavaScript垃圾回收算法的改进都是基于标记清除算法来实现的,但并没有改变标记清除算法本身和它对“对象不再需要”定义的简化。

作者:zhansingsong

地址:https://github.com/zhansingsong/js-leakage-patterns

JavaScript内存那点事相关推荐

  1. JavaScript 内存机制(前端同学进阶必备)

    JavaScript 内存机制(前端同学进阶必备) 简介 每种编程语言都有它的内存管理机制,比如简单的C有低级的内存管理基元,像malloc(),free().同样我们在学习JavaScript的时候 ...

  2. JavaScript内存管理机制以及四种常见的内存泄漏解析

    转自:http://geek.csdn.net/news/detail/238898 原文:How JavaScript works: memory management + how to handl ...

  3. JavaScript内存优化

    相对C/C++ 而言,我们所用的JavaScript 在内存这一方面的处理已经让我们在开发中更注重业务逻辑的编写.但是随着业务的不断复杂化,单页面应用.移动HTML5 应用和Node.js 程序等等的 ...

  4. 有关CPU与内存的那些事

    CPU与内存的那些事 下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You ...

  5. 无法读取内存属于错误吗_深入了解 JavaScript 内存泄露

    用户一般不会在一个 Web 页面停留比较久,即使有一点内存泄漏,重载页面内存也会跟着释放.而且浏览器也有自动回收内存的机制,所以我们前端其实并没有像 C.C++ 这类语言一样,特别关注内存泄漏的问题. ...

  6. 搞懂深浅拷贝JavaScript内存之栈和堆

    对于前端来说,平时开发业务代码的时候根本不会关心JavaScript的内存问题,因为根本用不到,也因此对于内存分配没有一点概念.只有理解了内存分配,对于深拷贝和浅拷贝才能真正理解.当然,理解内存分配对 ...

  7. javaScript 内存管理机制

    大家好,今天分享的主题为 JavaScript 内存管理机制,本次分享将从以下三部分进行讲述: js 内存管理与 js 垃圾 常见的 GC 算法 V8 引擎的垃圾回收 js 内存管理与 js 垃圾 关 ...

  8. 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则

    在前几篇将Java内存模型的那些事基本上把这个域底层的概念都解释清楚了,聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 这篇分析了在X86平台下,volatile,synchronize ...

  9. Chrome开发者工具之JavaScript内存分析

    为什么80%的码农都做不了架构师?>>>    内存泄漏是指计算机可用内存的逐渐减少.当程序持续无法释放其使用的临时内存时就会发生.JavaScript的web应用也会经常遇到在原生 ...

最新文章

  1. 扩增子统计绘图6韦恩图:比较组间共有和特有OTU或分类单元
  2. Symbols in Interllij IDEA
  3. Handler线程间通信
  4. JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)
  5. (转载)最黑的黑客米特尼克:多次耍FBI 终被高手擒
  6. 【Java学习】JDBC可以再深一点理解
  7. 提交spark任务偶尔报错 org.apache.spark.SparkException: A master URL must be set in your configuration
  8. 搜索、推荐、广告中的曝光偏差问题
  9. ajax load html页面,jQuery – AJAX load() 方法 | 菜鸟教程
  10. 最大-最小 滤波器实现 及用于边缘检测
  11. [转]安装 phpmyadmin 无法载入 mcrypt 扩展 Mcrypt库安装
  12. numpy.linalg——线性代数运算
  13. 【学习笔记】python实现excel数据处理
  14. 微信小程序npm引用ui框架
  15. 根据人脸关键点做人脸对齐face alignment----C++实现
  16. 埋葬了我曾经的执着与思恋题记不过是所谓的世界末日
  17. python求两个数的最大公约数_python中求最大公约数的三种方法
  18. c语言入门题目:输出两行短句
  19. Arduino追光小车
  20. 2020年创业风口:社交电商

热门文章

  1. 苹果M1芯片:如何开启一个时代
  2. 精通那么多技术,你为何还是受不到重用?
  3. 迁移学习实战 | 快速训练残差网络 ResNet-101,完成图像分类与预测,精度高达 98%!...
  4. AI 修复 100 年前晚清影像喜提热搜,有穿越内味儿了!
  5. 12306 出招抢票软件,技术黄牛生意要“黄”?
  6. 世界最前沿黑科技实验室 MIT Media Lab 教授 Cynthia: 让社交机器人陪伴千万家庭成为现实...
  7. DevOps 火爆,要学这么多技术!
  8. 微信回应 iOS 13.2 杀后台;谷歌以 21 亿美元收购 Fitbit;优麒麟 19.10.1 发布 | 极客头条...
  9. Google 究竟是不是要用 Fuchsia OS 取代 Android?
  10. 数据库的 N 多骚操作了解一下?