锁定老帖子 主题:关于jquery内存回收问题请教
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-26
ayeah 写道 搞javascript这么高层的东西还要研究内存回收?
当将IE嵌入其他客户端的时候就要关注这方面了,不然用户看到这个客户端的内存会越来越多 |
|
返回顶楼 | |
发表时间:2008-08-26
jljlpch 写道 这里为什么会出现内存问题呢? 1. 递归的removeChild貌似可以解决问题?那么也就是说,之所以没有被回收,是因为下面这些node之间存在引用? 我估计是不应该在<table><tbody></tbody></table>中间直接嵌套表格啊。这样应该会存有引用。 如有不对的地方,请多多指教。这里仅仅只是技术的交流以。 我试过将<table><tbody></tbody></table>改成<div></div>,还是存在这个问题, 我又试了不使用jquery.js,将$("#songList").append(str); 改成 document.getElementById("songList").innerHTML=str; 发现节点没有增加的,内存从每次增加500K变成了70K左右,这种情况是不是算正常了?这70K的内存新增是IE浏览器本身存在的内存没有回收问题还是JS内存没释放,还请知道的给解答一下, 以下是我用来测试的例子 <html> <head> </head> <body> <div id="songList"> </div> <a href="#" onclick="getList()">点击装载数据</a> </body> <script type="text/javascript"> function getList() { var str="" for(var i=0; i < 10; i++) { str+='歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名'; } document.getElementById("songList").innerHTML=str; str = null; } </script> </html> 这种情况下点"点击装载数据",IE内存也会新增,我用的浏览器是IE6 |
|
返回顶楼 | |
发表时间:2008-08-26
加上
document.getElementById("songList").innerHTML=""; 在function getList() { 之后 就可以释放这部分内存。我试了一下。 Ext就是这样做的。 |
|
返回顶楼 | |
发表时间:2008-08-26
以前遇到过,ext2.0之前版本多刷几次内存占用就会直线上升,2.0后没试过.
LZ可看看这个: http://msdn2.microsoft.com/en-us/library/bb250448.aspx E文 http://birdshome.cnblogs.com/archive/2006/05/28/IE_MemoryLeak.html 中文 |
|
返回顶楼 | |
发表时间:2008-08-30
zhanjianhua 写道 ayeah 写道 搞javascript这么高层的东西还要研究内存回收?
当将IE嵌入其他客户端的时候就要关注这方面了,不然用户看到这个客户端的内存会越来越多 这个确实,我们也是将ie放到一个dll里给另一个厂商调用,ie访问我们一个web应用,里面用ajax生成树,xml来传送数据,我明显感觉到了速度太慢~。。。。 还好我们是做成dll,他们也看不出来到底是谁的问题 |
|
返回顶楼 | |
发表时间:2008-09-08
浏览器本身有问题,只能期待解析javascript的速度变快.当然我们的写法也是会有问题的.
|
|
返回顶楼 | |
发表时间:2008-09-09
jquery要浏览器释放内存,好像只能用empty()和remove()来减少dom的数目。。。
|
|
返回顶楼 | |
发表时间:2008-09-10
还是ext来的实在,注意内存泄露问题;
据我观察jquery和prototype都没有做innetHTML=''处理…… |
|
返回顶楼 | |
发表时间:2008-09-10
innetHTML='' 目前来看是最有效果的处理方式
不过我现在碰到个问题 比如$(BODY).append('<DIV>XXX</DIV>'); 我还没想好 <DIV>XXX</DIV> 怎么清理起来比较方便 |
|
返回顶楼 | |
发表时间:2008-09-10
jQuery.fn.removeNode = function(){
var d; return function(){ if(this[0] && this[0].tagName != 'BODY'){ d = d || document.createElement('div'); d.appendChild(this[0]); d.innerHTML = ''; } } }(); 先注册removeNode 之后再通过$('div').removeNode();就可以了。 不过没有清除与之相关的事件和expando中加入的data. 还是不完善。 Ext中的也是很有问题。 |
|
返回顶楼 | |