垃圾回收和内存管理

内存管理是很重要的一部分,系统分配给浏览器的内存空间很少,如果不能很好的管理内存很可能因为某个页面导致浏览器的崩溃。

虽然js有垃圾回收机制,但是在程序中如果不用的对象,要及时释放引用等待gc回收

js垃圾回收的机制

1. 标记清除

当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。

2. 引用计数

基本原理就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

引用计数有很大的问题,因为可能有些对象的引用计数永远不可能为0,所以js都是用标记清除的方式。

但是在IE中有一部分对象并不是原生的js对象,比如BOM和DOM 使用C++以COM(Component Object Model) 对象形式存在的,而COM对象的垃圾回收策略就是采用引用计数的。因此即使IE的JS引擎使用标记清除,但是JS访问的COM对象依然是引用计数策略,也就是使用了COM对象就会存在循环引用问题。

导致内存泄漏例子

function assignHandler(){
    var element = document.getElementById("se");
    element.onclick = function(){
        alert(element.id);
    }
}

在匿名函数中保存了element的引用,所以element的引用次数永远不可能为0,也就是永远不可能被回收。

解决上述问题,让我们修改如下

function assignHandlers(){
    var element = document.getElementById("se");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    }
    element = null;
}

将匿名函数要用的数据保存到assignHandler函数作用域下的临时变量中,然后将删除element对象的引用。

注:闭包会引用包含函数的整个活动对象,即使没有直接引用element,但活动对象中包含了element的引用,所以必须把element设置为null才可以。

时间: 2024-10-03 04:48:56

垃圾回收和内存管理的相关文章

AS3的垃圾回收与内存管理

GC 和内存泄露无关 垃圾回收,这次是一个被无数人讨论过的传统话题. Action Script 使用的是和 Java 相似的内存管理机制,并不会即时回收废弃对象的内存,而是在特定时间统一执行一次 GC(Gabage Collection)操作来释放废弃对象的内存,避免了重复判断是否需要回收产生的性能问题. 但要注意,这只是决定回收的时机,而不是回收的内容.这个延迟执行内存回收也就是个表面的现象,不管什么时候执行 GC,能够回收的内存最终都能回收,不能回收的肯定不能回收.唯一的影响是,因为回收是

JavaScript 之垃圾回收和内存管理

JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源. 在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理.这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间

Java中的垃圾回收机制&内存管理

1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所使用的内存. 垃圾收集器是自动运行的,无须显式地请求垃圾收集器,程序运行时,垃圾收集器会不时检查对象的各个引用,并回收无引用对象所占用的内存. 可以调用System类中的静态gc()方法来运行垃圾收集器. 2. Java语言并不要求JVM有gc,也没有规定gc如何工作. Java垃圾回收机制是为所有

【java虚拟机序列】java中的垃圾回收与内存分配策略

在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃圾回收(Garbage Collection,GC)是java语言的一大特色,在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.而在C/C++中是需要程序员主动释放的,而在java中则交给JVM自动完成,既然是交给程序自动执行,那么这里就必须完成以下几件事:

.NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配

在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收. 在" .NET的堆和栈02,值类型和

Java的垃圾回收和内存分配策略

本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不同的的数据区的什么? 1.Java运行时数据区的划分 如下图: 其中程序计数器,虚拟机栈,本地方法栈这3个区域的内存随线程而生,随线程而灭的,因此这几个区域的内存分配与回收都是有确定的,我们不需要考虑这几个区域的内存的分配与回收.而堆和方法区则不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分

闭包,作用域链,垃圾回收,内存泄露

关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (- o -)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --<JS高级程序设计第三版> p178 函数对象可以通过作用域链相关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性称为 ‘闭包’ . --<JS权威指南> p183 内部函数可以访问定义它们的外部函数的参数和变量(除了this和argument

JS闭包、作用域链、垃圾回收、内存泄露相关知识小结

补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点: 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript语言的一大

Java 垃圾回收与内存分配策略

垃圾回收是什么? 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 怎么判断一个对象是否需要收集? 引用计数(最简单古老的方法) : 指将资源(可以是对象.内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放. 引用计数缺陷:引用计数无法解决循环引用问题:假设对象A,B都