JavaScript 内存管理和垃圾回收

时间: 2017-11-23阅读: 1016标签: 内存

JavaScript 的内存管理和垃圾回收,是个略生僻的话题,因为在JavaScript 中不显式执行内存操作,不过最好了解它如何工作。

在低级语言(如 C)中,开发人员需要使用 malloc()、calloc()、realloc()和 free()方法手动分配和释放内存。 在高级语言(如 Java 和 JavaScript)中,不需要明确分配或释放内存。 JavaScript 值在实体(对象、字符串等)创建时分配,不再使用时自动释放。 这个过程称为垃圾回收(Garbage collection,GC)

内存生命周期:

无论何种语言(高级或低级),内存生命周期都如下面所示。


在高级语言中,我们只明确的读写内存(使用内存)。 在低级语言中,开发人员需要明确的执行所有三个步骤。

分配和回收是自动发生的,然而这并不意味着开发人员不需要关心内存管理。 不良编码导致内存泄漏,这种情况下,内存已经不再被应用程序使用,却未被释放。 因此,更多地了解内存管理非常重要。


JavaScript 的内存分配:

声明变量时,JavaScript 自私为变量分配内存。

var numberVar = 100;                // 为数字分配内存
var stringVar = 'node simplified';  // 为字符串分配内存
var objectVar = {a: 1};             // 为对象分配内存
var a = [1, null, 'abra'];          // 为数组分配内存
function f(a) {
  return a + 2;
} // 为函数分配内存

内存不再需要时,分配的内存会被释放。 内存泄漏,以及大多数内存相关问题,都在释放内存时发生。 最难的环节是找出不再使用的内存,并使用垃圾回收器追踪。


垃圾回收:

垃圾回收是找出应用程序不再使用的内存并释放的过程。 为了寻找哪些内存不再使用,垃圾回收器要用到一些算法,在这一部分,我们分析主要的垃圾回收算法和它们的局限性。 我们研究以下算法:

引用计数垃圾回收。
标记-清除算法。


引用计数垃圾回收:

这是最重要的垃圾回收算法。 在引用计数算法中,如果没有对某个对象的引用,它会自动被垃圾回收。 该算法将零引用对象视为应用程序不再使用的对象。

Example:

var o = { a: { b: 2 } };
// 2 个对象被创建。其中一个被另一个作为属性而引用。
// 显然,没有对象可以被垃圾回收。
o = 1;     // 原来作为 o 的 a 属性的对象,已经没有引用。可以被垃圾回收。

缺陷:循环依赖

function func() {
  var o = {};
  var o2 = {};
  o.a = o2; // o 引用 o2
  o2.a = o; // o2 引用 o
  return 'true';
}
func();

考察上面的代码片段,其中 o 被 o2 引用,o2 被 o 引用,形成一个循环。 离开该方法范围时,这两个对象是无用的。 但是,垃圾收集器无法释放内存,因为这两个内存仍然互相引用。 这导致应用程序的内存泄漏。


标记-清除算法:

垃圾回收器使用此算法在对象不可到达时释放内存,而不是零引用对象。

垃圾回收器首先找到所有全局对象或根对象,并找到所有对这些全局对象的引用,以及对引用对象的引用,依此类推。 使用该算法,垃圾回收器识别出可达到和不可达到对象。 所有无法到达的对象都将自动被垃圾回收。

本文首发在 Node Simplified。 看看 Top Javascript Tips and Tricks

如果喜欢本文,点赞并转发给开发者朋友吧 谢谢阅读。


站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/157

通过内存分析来解释JavaScript数组赋值问题

初始的内存分布,形参变量存在栈中,对象存在堆内。如图,栈中有arr,arr0,还有fun的形参data三个变量,分别指向了堆中的两个数组对象的首地址。

怎样修复Web应用程序中的内存泄漏?

从服务器端渲染的网站切换到客户端渲染的 SPA 时,我们突然不得不更加注意用户设备上的资源,必须做很多工作:不要阻塞 UI 线程,不要使笔记本电脑的风扇疯狂旋转,不要耗尽手机的电池等。我们将交互性和“类应用程序”行为转换成了更好的新型问题

为什么要内存对齐

CPU访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问。比如32位的CPU,字长为4字节,那么CPU访问内存的单位也是4字节

JavaScript内存管理

高级语言解释器嵌入了“垃圾回收器”,监控着所有对象,当对象生存周期结束时会将其删除。内嵌的垃圾回收器的问题:自动寻找是否一些内存“不再需要”的问题是无法判定的

JavaScript的内存模型

在我们的前端日常工作中,无时无刻不在进行着变量的声明和赋值,你是否也曾碰到过变量声明报错或变量被污染的问题,如果你跟笔者一样碰到过,那么我们应该暂时停下来好好思考问题发生的原因以及如何采取相应的补救措施

Node.js的内存分配和垃圾回收

Node.js是一个由JavaScript V8引擎控制的C++程序,V8的内存管理模式一个运行的程序通常是通过在内存中分配一部分空间来表示的。这部分空间被称为驻留集(Resident Set)。

Js内存泄露

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

JS内存管理

像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。相反,JavaScript是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。 释放的过程称为垃圾回收。这个“自动”是混乱的根源

闭包真的会导致内存泄漏?

今天遇到一个很有争议的问题,在这里分享一下,我相信对于即将面试前端的小伙伴会有帮助的。主要内容是围绕下边的问题展开的,文章涉及到的其他方面的知识点不展开叙述。

Web 应用的内存优化

随着 Web 应用复杂程度越来越高,以及 NodeJS 大规模投入生产环境,许多 Web 应用都会长时间运行, JavaScript 的内存管理显得更为重要。JavaScript 具备自动回收垃圾的机制

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广