JavaScript——垃圾回收机制

目录

一、前言

二、内存泄漏

三 、垃圾回收机制概述

四、垃圾回收方法

1、标记清除

2、引用计数


一、前言

我们学过的大多数语言都是提供自动内存管理机制也即垃圾回收机制的,比如C#、Java、JavaScript。这里指的垃圾是我们没有被引用的对象或变量或者是无法访问到的对象。js的执行环境会自动对这些垃圾进行回收,也就是会释放那些不再使用的变量所占用的内存,收垃圾的过程会按照固定的个时间间隔进行周期性的执行垃圾回收。

二、内存泄漏

我们为什么要在垃圾回收机制讲到内存泄漏呢?

首先想一想,如果我们上面提到的垃圾——那些我们不再使用的变量没有被释放会怎么样呢?答案是会造成内存泄漏。

那什么是内存泄露呢?

我们都知道程序的运行需要内存,当程序提出要求时,操作系统就会供给内存。对于不再用到的内存,没有及时释放就叫做内存泄漏。

对于持续运行的服务程序,必须及时释放内存,否则,内存占用越来越高,轻则影响系统性能。

这就说明垃圾回收是很有必要的。

、垃圾回收机制概述

垃圾回收机制(GC:Garbage Collection),负责执行环境负责管理代码执行过程中使用的内存。

垃圾回收器会定期即周期性地找出那些不再用到的变量,然后释放其内存。

周期性是因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性地执行。

不在用到的变量是指生命周期结束的变量。

四、垃圾回收方法

目前在各大浏览器中通常采用的垃圾回收机制方法有两种——标记清除和引用计数。

1、标记清除

这是js中最常用到的垃圾回收方式。它的原理是:在函数声明一个变量时,就将这个变量标记为“进入环境”;当变量离开环境时,就将其标记为“离开环境”;等到垃圾回收执行时,会根据标记来决定要清除哪些变量进行释放内存。

我们可以配合一段代码进行理解:

function test(){

    var a = 2;  //被标记,进入环境

    var b = 5;  //被标记,进入环境

    console.log("a × b= "+a*b);

}

test();  //执行完毕后,函数中被标记过的变量a、b又被标记成离开变量,最后被回收

2、引用计数

引用计数是一种不太常用的垃圾回收方式,因为它常常会导致内存泄露,低版本的IE使用这种方式。引用计数的策略是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量变成了另外一个时该值的引用次数便减1。当该值引用次数为0时,则说明没有办法再访问这个值了,被视为准备回收的对象,每当过一段时间开始垃圾回收的时候,就把被引用数为0的变量回收,释放其对应的内存。

那么为什么引用计数这种方法会导致内存泄漏呢?试想一下,如果一个值不再被需要了,但是它的引用数却不为0,那么在引用计数这种机制下,垃圾回收机制无法释放这块内存,从而会导致内存泄漏。

可以配合一段代码来理解:

var arr = [1,2,3,4];

console.log("Hello world!");

上面的代码中,我们可以看到数组[1,2,3,4]是一个值,它会占用内存,变量arr是仅有的对这个值的引用,因此引用次数为1且持续占用内存。

var arr = [1,2,3,4];

console.log("Hello world!");

arr = null;

如果增加一行代码,解除arr对[1,2,3,4]的引用,这样引用次数减1后变成0,内存可以被释放出来了。

由此可见,虽然垃圾回收机制是一种自动内存管理机制,但是程序员还是需要关注内存的占用,对于程序中很占空间的值,一旦不再用到,需要检查是否还存在对它们的引用,如果是的话,就必须进行手动解除引用。

你可能感兴趣的:(JavaScript,javascript)