JavaScript的垃圾回收机制与内存泄漏

常用的两种算法:

引用计数(新版浏览器已弃用,弃用原因:会出现循环引用的情况,无法进行垃圾回收,导致内存泄漏)

标记清除

引用计数法

引用计数,顾名思义一个对象是否有指向它的引用,即看栈中是否有指向要释放的该块堆内存中的地址,如果没有,则该块内存是不需要的,可以进行释放,即垃圾回收

下面引用大佬的一个简短例子来说明情况

 1 // 创建一个对象person,他有两个指向属性age和name的引用
 2 var person = {
 3     age: 12,
 4     name: ‘aaaa‘
 5 };
 6 ?
 7 person.name = null; // 虽然name设置为null,但因为person对象还有指向name的引用,因此name不会回收
 8 ?
 9 var p = person;
10 person = 1;         //原来的person对象被赋值为1,但因为有新引用p指向原person对象,因此它不会被回收
11 ?
12 p = null;           //原person对象已经没有引用,很快会被回收
13  

缺点:引用计数有一个致命的问题,那就是循环引用

当两个对象相互引用,尽管他们已不再使用,但是垃圾回收器不会进行回收,最终可能会导致内存泄露。

1 function cycle() {
2     var o1 = {};//1
3     var o2 = {};//1
4     o1.a = o2;//2
5     o2.a = o1; //2
6     return "cycle reference!"
7 }
8 ?
9 cycle();

cycle函数执行完成之后,对象o1o2实际上已经不再需要了,但根据引用计数的原则,他们之间的相互引用依然存在,因此这部分内存不会被回收。所以现代浏览器不再使用这个算法。

但是IE依旧使用。

1 var div = document.createElement("div");
2 div.onclick = function() {
3     console.log("click");
4 };

上面的写法很常见,但是上面的例子就是一个循环引用。

变量div有事件处理函数的引用,同时事件处理函数也有div的引用,因为div变量可在函数内被访问,所以循环引用就出现了。

标记清除(常用)

文章里写的是:标记清除算法将“不再使用的对象”定义为“无法到达的对象”。即从根部(在JS中就是全局对象)出发定时扫描内存中的对象,凡是能从根部到达的对象,保留。那些从根部出发无法触及到的对象被标记为不再使用,稍后进行回收。

我这里个人理解:不在原型链上的,不能从全局对象链找到的对象,会被认为是无法到达的对象(也可能我自己理解有误,忘读者指出),比如说下面这个例子

1 var a = {}  // 这里的a是挂在全局对象上的
2
3 a = null  // 这里a之前存放指向{}的地址变成了null
4
5 // 此时{}是无法找到的,通过全局对象找到a也无法到达{},因此{}会被垃圾回收

无法触及的对象包含了没有引用的对象这个概念,但反之未必成立。

所以上面的例子就可以正确被垃圾回收处理了。

所以现在对于主流浏览器来说,只需要切断需要回收的对象与根部的联系,就能进行垃圾回收

下面还是引用大佬的例子

最常见的内存泄露一般都与DOM元素绑定有关:

email.message = document.createElement(“div”);
displayList.appendChild(email.message);
?
// 稍后从displayList中清除DOM元素
displayList.removeAllChildren();

上面代码中,div元素已经从DOM树中清除,但是该div元素还绑定在email对象中,所以如果email对象存在,那么该div元素就会一直保存在内存中

参考文章:(https://www.muyiy.cn/blog/1/1.4.html#垃圾回收算法)

原文地址:https://www.cnblogs.com/liuarui/p/11387345.html

时间: 2024-10-07 13:02:47

JavaScript的垃圾回收机制与内存泄漏的相关文章

Java垃圾回收机制以及内存泄漏

原文地址 前言 在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的案例.本问题视图给出此问题的完整答案. 垃圾回收机制简介 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果只是不停的分配内存,那么程序迟早面临内存不足的问题.所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用. 内存回收机制按照实现角色的不同可以分为两种,一种是程序员手动实现内存的释放

160930、Javascript的垃圾回收机制与内存管理

一.垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存. JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行. 不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生

javascript的垃圾回收机制和内存管理

垃圾回收 javascript不同于c.c++的一个特点是:具有自动的垃圾回收机制,这就意味着,开发人员可以专注于业务,而不必把过多精力放在内存的管理上,提高开发效率. 所谓的垃圾回收就是找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作. 目前在浏览器中,实现垃圾回收的方式主要有两种:1.标记清除也是javascript最常用的垃圾回收的方式.在标记清除的方式中有两个概念:『进入环境』和『离开环境』.『进入

Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略[转]

V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带来的内存泄露问题. 但使用了垃圾回收即意味着程序员将无法掌控内存.ECMAScript没有暴露任何垃圾回收器的接口.我们无法强迫其进 行垃圾回收,更无法干预内存管理 内存管理问题:在浏览器中,Chrom

垃圾回收机制和内存泄露

在C/C++中,需要程序员手动地回收分配的内存,否则一直被占用,这就会带来一些问题,当程序员忘记回收无用内存或者错误回收程序核心类库的内存,都会导致程序的崩溃. 在java中不必程序员关心内存回收,当没有对象引用的对象所占用的内存(注意不是对象本身)时,java视其为垃圾,会有JRE在后台自动完成回收.这种机制称为垃圾回收机制(Garbage Collection ,简称GC).下面我们来回答下面几个问题: 1.由谁来回收垃圾? 在java程序运行过程中,有一个垃圾回收器(GC)会不定时地被唤起

JavaScript中的垃圾回收机制与内存泄露

什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他们不会再被用到,但是还没有及时释放,这就叫做内存泄露(memory leak).如果出现了内存泄露,那么有可能 C语言是通过手动分配和释放内存的, 如通过malloc分配,通过free释放,这种方式是比较麻烦的.而java.c#.js等是为了解放程序员的负担,提出了程序自动释放内存,这种方式就是垃圾

Nodejs通过Thrift操作hbase卡住原因分析及与javascript的垃圾回收机制的关系

在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进不到hbase下取数据,出现socket hang up的错误,查了很多资料也没解决.当时认为是hbase的并发数问题,其并发数的限制导致了资源负载的极限,后来不断测试找到原因所在,其实与hbase处理并发的能力无关,真正的原因是jsvascript的垃圾回收机制使得资源使用达到瓶颈,下面是代码处理

浅析JavaScript的垃圾回收机制

JavaScript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation).通常我们使用new创建对象,GC负责回收对象占用内存区域.因此了解GC,可以加深对javascript垃圾回收机制的理解.惠民县宿哲服装 GC在回收内存时,首先会判断该对象是否被其它对象引用.在确定没有其它对象引用便释放该对象内存区域.因此如何确定对象不再被引用是GC的关键所在. <script type=&qu

PHP垃圾回收机制防止内存溢出

PHP语言同其他语言一样,具有垃圾回收机制.那么今天我们要为大家讲解的内容就是关于PHP垃圾回收机制的相关问题.希望对大家有所帮助. 一.PHP 垃圾回收机制(Garbage Collector 简称GC) 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾.PHP会将其在内存中销毁:这是PHP的GC垃圾处理机制,防止内存溢出. 当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁.GC进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在s