javascript如何避免内存泄漏

文章来自ajax in action,里面的例子可以让我们更容易理解“避免内存泄漏”

任何程序都有可能发生内存“泄漏”(即申请了系统内存并且在工作完成后没有释放),并且对于使用非托管语言(unmanaged languages)(如C语言)的开发者来说,内存的分配和释放是一个主要的关注点。JavaScript是一种内存托管(memory-managed)的语言,垃圾回收过程能够帮助程序员自动地处理内存的分配和释放。该机制解决了大部分困扰的非托管代码的问题,但是,认为内存托管语言不会产生内存泄漏却是错误的。

垃圾回收进程尝试推断何时可以安全地回收不再使用的变量,通常是通过判定程序是否能够通过变量之间形成的引用网络到达该变量。当确信变量是不可达的,就在它上面标上可以回收的记号,并且在回收器的下一次清理中(可能在未来的任意时刻)释放相关的内存。在托管语言中产生内存泄漏非常简单:只需使用完变量而忘记解除引用。

我们来考虑一个简单的例子,其中定义了一个描述家庭宠物及其主人的对象模型。首先看看主人,以Person对象描述:

function Person(name){
 this.name=name;
 this.pets=new Array();
}

一个主人可以养一只或者多只宠物。当主人得到了一只宠物,他告诉宠物现在自己是它的主人:

阅读全文 »

你的内存侧漏了吗

标题党了,其实是内存泄露。(是泄露!!)以下纯是个人见解,读者自辩

首先什么是内存侧漏呢?

我的理解是内存不能被有效的利用,或者内存在被使用后不能有效的回收再利用,最后造成可利用的内存减少,影响执行效率。

之前写JavaScript的时候并不会特意去关注内存泄露的问题,因为那都是些小case,代码也只有几百行。就算造成内存泄露,也被忽略了。(习惯就是这样慢慢养成的,推荐大家不要如此这般)

javascipt内存泄露是如何产生的?

其实很容易产生,当你这么做以后:

function HelloWorld() {
   var robot = document.getElementById('robot');
   robot.onclick = function () {
      window.alert('Hello World!');
   };
}

没有去做robot.onclick = null;robot = null;,其实内存就少量的侧漏了...如何保护呢,我们可以换一种形式:

function sayHelloToWorld() {
   window.alert('Hello World!');
}
function HelloWorld() {
   var robot = document.getElementById('robot');
   robot.onclick = sayHelloToWorld;
}

以上就是循环结构(cyclic structure),解释一下:给ID为robot的DOM元素(以下称DOM:robot)添加一个onclick事件函数,DOM:robot就有了相应的事件处理函数,而JavaScript函数对象中也有了DOM:robot的onclick属性,这就形成了循环结构。循环结构所占用的内存是可以被垃圾回收器(garbage collector)回收的,但是由于某个主流浏览器的回收机制有问题,会加重内存泄露。

使用第二种方法,也就是抛弃了闭包(closure)的方式,内存泄露也就跟着去了...

[我的收藏]2008年04月21日(1)

以下是fireyy于2008年04月21日与您分享的 1 条收藏:

jQuery for Designers - Tutorials and screencasts

提供jQuery做各种效果的教程

(tags: jquery javascript js)

本文为 del.icio.us 每日自动发布,了解我的更多收藏,可以关注收藏页面

[我的收藏]2008年04月15日(3)

以下是fireyy于2008年04月15日与您分享的 3 条收藏:

春季档日剧:金星和火星的碰撞

春季的日剧也开播了,极道3好!!

(tags: dorama japan)

Socialthing!

又一个social工具,同样是邀请形式...现在好多啊

(tags: web2.0 socialnetworking)

Intense Debate

加强blog评论功能的一个网站应用,有空自己也试试看

(tags: blog comments)

本文为 del.icio.us 每日自动发布,了解我的更多收藏,可以关注收藏页面

href执行javascript好吗

昨天在实际应用中发现href执行javascript会影响iframe的载入,具体表现为在IE下,当点击了带有href="javascript:xxx;"这样的链接时,如果有iframe正在载入,那iframe就会停止载入动作。

其实我并没有让href去执行javascript的意思,我的应用习惯的是这样的href="javascript://;" onclick="xxx();",以前一直没发现这个问题,暂时修改成这样onclick="xxx();return false;"来解决问题,养成这个不良的习惯比较糟糕(更糟糕的其实是写inline javascript的习惯)

 « 1 2 3 4 5 6 7 ...57 58 59 »