JavaScript 内存管理和垃圾回收

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

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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

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

JavaScript内存管理

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

js 把一个对象赋值给另一个对象会指向同一个内存地址

实际上并不是新建一个和原对象(数组也是对象)完全一样的对象,而是把原对象的内存地址直接复制给了另一个对象,也就是说两个对象都是指向同一个内存地址,所以实际上它们就是同一个对象。

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

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

php底层原理之垃圾回收机制

php垃圾回收机制,对于PHPer来说是一个不陌生但是又不是很熟悉的内容。那么php是怎么实现对不需要的内存进行回收的呢?首先还是需要了解下基础知识,便于垃圾回收原理内容的理解。

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

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

js内存数据

位(bit):二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。字节(Byte,B):计算机中数据的基本单位,每8位组成一个字节。各种信息在计算机中存储

原生JS与Jquery删除iframe并释放内存-IE

当项目以tab页签方式打开多个iframe窗口时,关闭tab页签同时也需要关闭iframe并释放内存资源,主要是针对IE浏览器。

JavaScript 事件对内存和性能的影响

虽说事件处理程序可以为现代 Web 页面添加很强的交互能力,但是不分青红皂白就添加大量的事件处理程序绝对是一种愚蠢的行为。我们来分析一下:事件处理程序本质上是一种函数,是一种对象

php中的内存管理

计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的。应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的库函数 向操作系统申请内存。

JS内存管理

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

点击更多...

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