js内存回收

1、标记清除

function test(){
  var a = 10;//被标记进入环境
}
test();//执行结束后被标记离开环境 被回收

2、引用计数

function test(){
  var a = {}; //a的引用次数为0
  var b = a; //a的引用次数为1
  var c = a;//a的引用次数为2
  var b = {};  //a的引用次数减1 为 1
}

当a 为零的时候,gc会将其回收销毁。

注意:循环引用计数,相互引用将无法使用引用计数回收。

function fn(){
  var a = {};
  var b ={};
  a.obj = b;
  b.obj = a;
}
fn();

3、内存泄漏常见的情况

一、意外的全局变量

function leaks(){
   leak ="xxx"; leak成为全局变量不会被回收
}

方案:添加"use strict" 可避免。

二、闭包引起的内存泄漏

function bindEvent(){
  var  obj =document.createElement("xx");
  obj.click = function(){
   //....
  }
}

闭包可以维持函数内的局部变量,使其得不到释放。

方案:将事件定义在外部, obj.click = this.clickFunction;  function clickFunction(){...}或者将其对象的引用删除 obj = null;

三、没有清理dom元素引用

var element = {
  button: document.getElementById("button");
}
function shuff(){
  button.click();RemoveButton()} function RemoveButton(){ document.body.removeChild(document.getElementById("button")); }

虽然 removeChild 移除了button,但element里还保留着对button的引用,则button还保留在内存里面。

四、被遗忘的定时器或者回调

var data = {};setInterval(function(){   var node = document.getElementById("Node");     if(node){       node.innerHtml = JSON.stringify(data);     }
  ...},1000)

如果id为Node的元素从Dom中移除,该定时器仍会存在,同时回调函数对data的引用,定时器外的data也无法释放。

五、子元素存在引用引起的内存泄漏

方案:单refA = null 无效,需要refA = null ; refB =null;

时间: 2024-10-09 01:09:44

js内存回收的相关文章

js内存回收机制

Javascript语言有自己的一套内存回收机制,一般情况下局部变量和对象使用完就会被系统自动回收,无需我们理会.但是碰到闭包的情况这些变量和对象是不会被回收的,对于普通的web站点,页面刷新或跳转这些内存也会被回收.如果是单页web站点,页面切换及数据请求都是通过ajax无刷新机制实现的,页面资源无法自动回收,时间长了会严重影响性能,造成内存泄漏甚至页面崩溃直接退出,这时候手动释放不用资源就非常必要了,包含删除dom.释放对象等想手动释放含有闭包的对象时,必须先将引用对象属性的事件删除,然后设

JS内存管理

JS中的内存管理,感觉就像JS中的一门副科,我们平时不太会忠实,但是一旦出现问题又很棘手,所以可以通过平时的多了解一些JS中的内存管理问题,在写代码中通过一些平时养成的习惯,避免内存泄露的问题. 不管什么语言,内存生命周期基本一致: 1.分配内存: 2.使用分配的内存(读.写): 3.不需要的时候再释放内存. C语言中,有专门的内存管理接口,像malloc()和free().JS中没有专门的内存管理接口,所有的内存管理都是自动的.JS创建变量是,自动分配内存,并在不使用的时候,自动释放该内存.这

js 作用域链&内存回收&变量&闭包

闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则

js垃圾回收及内存泄漏

js垃圾回收 js能够自动回收申请却未使用的内存,由于每次清除需要的性能较大,不是时时在刷新,而是每隔一段时间才进行一次. 回收的两种方式 标记清除(常用) 在内存中先标记变量,然后清除那些那些进入环境或者引用的变量的标记,当进入环境退出环境,将被重新标记并被清除,释放出内存. 引用计数 计算变量被引用的次数,引用次数为0将被清除释放内存. 缺点: 无法清除那些引用次数不为0,但又不需要的内存 let arr = [1,2,3]; console.log('ok'); //数组[1,2,3]引用

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

Node.js内存泄漏分析

在极客教育出版了一个视频是关于<Node.js 内存泄漏分析>,本文章主要是从内容上介绍如何来处理Node.js内存异常问题.如果希望学习可前往极客学院: 本文章的关键词 - 内存泄漏 - 内存泄漏检测 - GC分析 - memwatch 文章概要 由于内存泄漏在Node.js中非常的常见,可能在浏览器中应用javascript时,对于其内存泄漏不是特别敏感,但作为服务器语言运行时,你就不得不去考虑这些问题.由于很小的逻辑可能导致服务器运行一天或者一个星期甚至一个月才会让你发现内存不断上涨,而

JS内存知识点汇总

废话片: 讲到内存可以联想到很多,内存分配管理,内存回收机制,内存泄露等等,今天我们就来答题的总结一下. 正文片: 1.内存分配管理 2.内存回收机制 3.内存泄露 一.内存分配管理 首先让我们看看内存的分配机制吧.其实在所有的语言中内存的分配都是一样的,首先在我们需要的时候记性内存的分配,然后是使用分配的内存,最后是当我们不适用的时候收回内存块. 问题:在js中是如何分配内存的呢,什么时候分配呢? 回答:在js中当我们定义了变量的时候实际上就为我们分配好了内存的,这样将会省去我们的很多麻烦.了

js内存空间详细图解-自己总结

原文出处http://mp.weixin.qq.com/s/NGqdjhoU3MR9LD0yH6tKIw 栈-先进后出堆-类比成书于书架(形象),只要知道Key就可以找到value 基础数据类型(Undefind,Null,Boolean,String,Number),按值访问,直接操作实际值 引用数据类型,按址访问,实际值是保存在堆内存中的对象,我们操作的是在栈中与实际值相关联的地址. 例题解析:画图就好理解var a = 20;var b = a;// 这里其实就是把20赋值给了b,按值传递

js内存泄露学习(转)

http://blog.csdn.net/kaitiren/article/details/19974269内存泄露不错的帖子,感谢分享 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个.Heap Profiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件,该描述文件给出了当时JS运行所用到的所有对象,以及这些对 ... 一.概述 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是