JavaScript 内存管理和垃圾回收

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

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

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

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

JS内存管理

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

Js内存泄露

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

Web 应用的内存优化

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

JavaScript 内存管理

JavaScript 具有垃圾自动回收机制(Garbage Collection)简称 GC。垃圾回收机制会中断整个代码执行,释放不可能再被使用的变量,释放内存,这个工作机制是周期性的,我们会在下文详细探讨。

js常见的内存泄漏及解决方法总汇

js具有自动回收垃圾的机制,即执行环境会负责管理程序执行中使用的内存。在C和C++等其他语言中,开发者的需要手动跟踪管理内存的使用情况。在编写js代码时候,开发人员不用再关心内存使用的问题,所需内存的分配 以及无用的回收完全实现了自动管理。

JavaScript中的垃圾回收和内存泄漏

程序的运行需要内存。只要程序提出要求,操作系统或者运行时就必须供给内存。所谓的内存泄漏简单来说是不再用到的内存,没有及时释放。为了更好避免内存泄漏,我们先介绍Javascript垃圾回收机制。

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

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

为什么要内存对齐

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

js内存数据

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

点击更多...

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