论坛首页 Web前端技术论坛

关于jquery内存回收问题请教

浏览 17670 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-20  
最近用了一段时间的JQUERY,发现用JQUERY中的.append()方法动态生成数据时,内存不会回收,我不知道是不是我使用有问题,
还是JQUERY本身就带有这问题.
以下是我写的一个HTML,
最近用了一段时间的JQUERY,发现用JQUERY中的.append()方法动态生成数据时,内存不会回收,我不知道是不是我使用有问题, 
还是JQUERY本身就带有这问题. 
以下是我写的一个HTML, <html>
<head>
</head>
<body>
<table cellpadding="0" cellspacing="0">
<tbody id="songList">
</tbody>
</table>
<a href="#" onclick="getList()">点击装载数据
</body>
<script type='text/javascript' src='jquery.js'></script>
<script type="text/javascript">
        $(document).ready(function(){
        	getList();
        })
        function getList() {
        	$("#songList").empty();
        	for(var i=0; i < 10; i++) {
			var str='<tr>'
		        	+'<td class="input">'+ i +'</td>'
		                +'<td class="gm"><span>歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名歌名</span></td>'
		            	+'<td class="gx"><span><a href="#" onclick="getlist();">歌星歌星歌星歌星歌星歌星</a></span></td>'
		            	+'<td class="mp3"><span><a href="">mp3</a></span></td>'
		            	+'<td class="mv"><span><a href="">mv</a></span></td>'
		            	+'<td class="ls"><span><a href="">ls</a></span></td>'
		        	+'</tr>';
        		$("#songList").append(str);
        		str = null;
        	}
        }
</script>
</html>


每次"点击装载数据"链接,能在任务管理器看到此IE进程的内存加了500K,请高手看看,看看怎么解决
  • jquery.rar (14.1 KB)
  • 描述: jquery.js文件
  • 下载次数: 61
   发表时间:2008-08-20  
补充:可以通过http://fins.iteye.com/blog/172891说到的sIEve-0.0.8.exe发现刷新一次表中每行中的节点都会增加190个节点
0 请登录后投票
   发表时间:2008-08-21  
empty()的问题,这个fins好像有提到过
empty()最终是调用node.parentNode.removeChild(node)来删除一个node,这种方法在ie下并不会释放占用的资源
可以采用ext的做法
        removeNode : isIE ? function(){
            var d;
            return function(n){
                if(n && n.tagName != 'BODY'){
                    d = d || document.createElement('div');
                    d.appendChild(n);
                    d.innerHTML = '';
                }
            }
        }() : function(n){
            if(n && n.parentNode && n.tagName != 'BODY'){
                n.parentNode.removeChild(n);
            }
        }

0 请登录后投票
   发表时间:2008-08-21  
ext 没了解过,JQUERY本身难道就没有释放回存的函数?
0 请登录后投票
   发表时间:2008-08-21  
按道理不应该出现内存的问题

建议
1、到FF中去试一下,看看是不是也会出现这样的情况?
2、把<tbody>去掉,把id="songList"写在<table>中试一下?

关于上楼说的Ext的做法,只不过它的实现起来更方便,这种做法能不能完全释放内存也是个问题。

jquery是对每一个后代元素都进行了
jQuery.event.remove(this);
jQuery.removeData(this);
this.parentNode.removeChild(this);

不应该会出现内存的问题。
0 请登录后投票
   发表时间:2008-08-21  
你的这种用法是有问题的
因为你的str是string ,
jquery会自动加上<table><tbody></tbody></table>
生成的html:


table cellpadding="0" cellspacing="0"> 
<tbody id="songList">

<table><tbody>
.......

</tbody></table>

</tbody> 
</table> 
0 请登录后投票
   发表时间:2008-08-21  
jljlpch 写道
按道理不应该出现内存的问题

建议
1、到FF中去试一下,看看是不是也会出现这样的情况?
2、把<tbody>去掉,把id="songList"写在<table>中试一下?

关于上楼说的Ext的做法,只不过它的实现起来更方便,这种做法能不能完全释放内存也是个问题。

jquery是对每一个后代元素都进行了
jQuery.event.remove(this);
jQuery.removeData(this);
this.parentNode.removeChild(this);

不应该会出现内存的问题。

建议你先研究下fins这篇文章:http://fins.iteye.com/blog/172891
再下结论

0 请登录后投票
   发表时间:2008-08-21  
楼上没有仔细看这文章吧和其评论吧
http://fins.iteye.com/blog/172263

removeNode在IE中只是在remove元素的子节点可能会有点问题
removeChild就不一定吗?
就算是一定吧,如果每个子元素只有没有嵌套的子元素呢?
removechild可以除掉。
jquery就是采用这个循环的方式每个都去除了。

注意事件handler会阻止回收,所以要先清干净。

ms的论坛上对此问题的帖子:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2840253&SiteID=1

jquery也对每个后代元素都做到了。

正确使用,使用jquery一般不会出现内存问题。

这里为什么会出现内存问题呢?

1. 递归的removeChild貌似可以解决问题?那么也就是说,之所以没有被回收,是因为下面这些node之间存在引用?
我估计是不应该在<table><tbody></tbody></table>中间直接嵌套表格啊。这样应该会存有引用。

如有不对的地方,请多多指教。这里仅仅只是技术的交流以。
0 请登录后投票
   发表时间:2008-08-23  
搞javascript这么高层的东西还要研究内存回收?
0 请登录后投票
   发表时间:2008-08-24  
严重关注这贴。同时我也想说,IE内存泄露很严重,本来我以为FF3没事,有一次发现了FF3也很成问题。就是我有一个页面是 frameset的,里面有一帧是不断地 refresh,是用 meta  头实现的。我打开这页面后没关,过了一段时间感觉不对劲一看内存,FF3占了3百多兆。

IE7在用了一段时间后,就算把所有的选项卡关了,内存也一直占用着。很恐怖
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics