|
锁定老贴子 主题:请教:IE下ajax应用中的内存泄漏
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-05-31
公司最近做一个应用ajax技术实现一个OPOA(one page one application)的web应用,只有一个html页面,页面内容都是服务器渲染过来。效果还可以,就是操作时间长了内存量上升较多,用了javascript的collectionGarbage()也没什么效果。局部变量的置null、页面元素的事件也去掉了但内存也下降不了多少;但是把窗口最小化内存使用明显下降,google了很多说是ie的问题,请教一下有什么好的方法解决这个问题吗?总不能让用户过段时间把窗口最小化一次吧:)。
非常感谢。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
无解,死心吧
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
js可能存在一些内存泄露问题。
首先,程序不当可能造成内存泄漏,例如可以释放的对象却仍旧有地方引用,导致无法回收,最常见的情况是存在某个数组里没有清除。 如果你使用ff和ie7也存在内存不断上升的情况,就说明你的程序可能有上述问题。 否则的话,你就可能是遇到了ie6的内存泄漏问题。通常是由使用大量closure引起(如不恰当的事件函数,如不恰当的使用xmlhttprequest),反复的改写innerHTML或插入删除元素也可能造成这类情况。原理上是因为存在js对象和com对象(ms的dom也是com对象)的循环引用(可能很隐蔽)导致jscript引擎无法回收对象。你可以下载工具drip来看是否存在这类问题。 最小化回收资源是windows的设计如此,与你的问题没有什么关系。collectionGarbage只是提示jscript引擎进行垃圾回收,但一般你没有必要去调用,且这种调用也无法解决内存泄漏。 如果没有内存泄漏,而耗费了太多资源,只能说明你的程序有一些问题,例如构造了太大的页面,创建了太多页面对象等等。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
谢谢楼上,使用了ajax框架之后,javascript代码量剧增,怎么去判断内存泄露还是程序有什么问题,有什么手段吗?
|
|
| 返回顶楼 | |
|
最后更新时间:2007-06-02
啊!!
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
通常,比较好的框架都没有内存泄露问题,当然前提是你好好用。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
hax 写道 ...
否则的话,你就可能是遇到了ie6的内存泄漏问题。通常是由使用大量closure引起(如不恰当的事件函数,如不恰当的使用xmlhttprequest),反复的改写innerHTML或插入删除元素也可能造成这类情况。原理上是因为存在js对象和com对象(ms的dom也是com对象)的循环引用(可能很隐蔽)导致jscript引擎无法回收对象。你可以下载工具drip来看是否存在这类问题。 这个循环引用导致的泄漏不难解决,参照一定的模式就好。例如,dom对象中不放或放很少临时对象(不然清理起来太麻烦),各event事件响应函数最好封装起来一次性清除。 objot库对这个问题做了简化。仅供参考:
abc = { tempData1: 0, tempData2: "abc" };
onClick = function(){
this.tempData1; this.tempData2;
this.element.des();
}
abc.element = $this($dom($id("elementId")), abc).attach('onclick', onClick);
给id为elementId的元素绑定onclick事件,并传递abc给回调函数,其中调用des()清除这个元素,一并清除了对onClick和abc的引用。des还可以被重写加入一些析构的动作。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
简单三步,搞掂内存泄漏!
如下简单的三步: 1. 当你完成后,设置你的 XMLHttpRequest onreadystatechange handlers 为null, 我使用 YAHOO.util.Connect 来进行XHR链接 ,因为它使用了 polling mechanism来代替readstate, 这样我不用手工set null了。我推荐你,在允许的情况下,使用YAHOO.util.Connect (或建于其之上的 YAHOO.ext.UpdateManager)。 2. 在unload事件中清除所有 DOM event handlers object ,如果它们有引用 (Refence)的机会的话。 能够让Library做的,就不要用自己的方法做! 对于事件event的机制,我均使用了YAHOO.util.Event来处理. 其它的library (prototype, dojo, etc) 亦有自己的相应的机制来处理。 --尽管我不清楚它们的执行效率去到那里。 3.除了一些基本类型的数据primitive value (String 、Number),切勿放其它任何东西在 DOM expando 或 property 。当然,你能保证及时清除它的话,便是一个例外。 这就是最重要的金科玉律了。在DOM expando放东西,你会觉得很方便, 然后用 $()获取它, 但千万不要这样做。 真的,我知道你在想什么,现在的我已经有线想妄想症的了.没错,很多场合都会把JS对象放到 DOM expando,也没啥状况发生,但也会有很多。。。。这种情况不容易检查出来啊!(例如:闭包closures). 所以要避免任何可能的发生,我只会按照这样的规律做. 摘要 解决这个问题并不是太难。它不需要任何技巧或经验之谈。只要注意好以上几点,一个新手novice也知道如何避免泄漏。 请拜托一些大网站(包括新的 Yahoo Mail!?!?),花点时间,做足功夫,让我(或其他人)浏览你的网页而不遭受内存泄漏。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-06-03
说起来容易做起来难。
实际上多数现在的内存泄露还是微软偷懒造成的下场。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-31
不是我说滴 ,引用自EXT作者JACK的话哦 嘻嘻
不过貌似EXT的MEMORY LEAKS也挺严重! |
|
| 返回顶楼 | |






