锁定老帖子 主题:有关js的垃圾回收的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-12-29
由于页签是可以动态添加和动态关闭的,而每个页签所展示的内容都比较复杂。 现在比较担心js的内存回收会不会有问题。 比如一个用户打开10个页签,关掉,再打开另外十个页签。这样会不会造成浏览器占用20个页签的内存? 这样到最后会不会就出问题了? 我随便写了个方法,方法内用数组申请了很大的一块内存。 在方法执行完都没有发现内存被释放。(IE和firefox都是) 实际上那个数组的生命周期早已结束。 这样的话js+dom构造界面在项目中大量采用会很麻烦吧? 有经验的请提示一下,谢谢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-12-29
http://www.microsoft.com/china/msdn/library/webservices/WebApp/mac0301WebQA.mspx
会很慢的. 我给你个建议.多用iframe, 引用 由于页签是可以动态添加和动态关闭的,而每个页签所展示的内容都比较复杂。
现在比较担心js的内存回收会不会有问题。 比如一个用户打开10个页签,关掉,再打开另外十个页签。这样会不会造成浏览器占用20个页签的内存? 这样到最后会不会就出问题了? 。 例如每个页签是个<div id="content1"></div>,你可能要这样实现$(content1).innerHtml=""; 我建议你<div id="content1"><iframe></iframe></div>,每个页签的内容不要由主页面控制. 我现在的项目就这样做的. |
|
返回顶楼 | |
发表时间:2005-12-29
请问zkj_beyond,div中的iframe内容如果狠多,高度如何动态控制?
|
|
返回顶楼 | |
发表时间:2005-12-29
hongliang 写道 请问zkj_beyond,div中的iframe内容如果狠多,高度如何动态控制?
其实我也遇到这个问题了. 改变div大小,里面的iframe的重新刷新. 你可以看看 http://forum.iteye.com/viewtopic.php?t=17357 这个项目,估计你可以用现成的了. http://rialto.application-servers.com/demoRialto.jsp 注意看左下的那个树相当于你的页签. 参考 http://www.dhtmlcentral.com/ |
|
返回顶楼 | |
发表时间:2005-12-29
感觉好像狠复杂。。。
|
|
返回顶楼 | |
发表时间:2005-12-30
关注ing,js得生命周期控制确实挺重要得
|
|
返回顶楼 | |
发表时间:2005-12-31
<BODY> <P>Place bb.html's content here.</P> <SCRIPT> function aa(); { var number=new Array();; for(var i=0;i<60000;i++); { number[i]=i; } } function bb(); { var number=new Array();; for(var i=0;i<60000;i++); { number[i]=i; } } </SCRIPT> <BUTTON onclick="aa();;" >aa</BUTTON> <br> <BUTTON onclick="bb();;" >bb</BUTTON> </BODY> 上面这段代码,只要你一直点按钮,内存就一直往上涨。 而且不释放。(我等了10分钟) 无论ie还是firefox,你只有最小化窗口,内存才会释放。 这样的话,就有问题了。 假如用ajax实现一个应用,查询出一个大数组用来作为报表展现, 每次查询出的结果如果没有被浏览器垃圾收集。那多点几遍查询的话,很有可能内存溢出吧? |
|
返回顶楼 | |
发表时间:2005-12-31
<BODY>
<P>Place bb.html's content here.</P> <SCRIPT> function aa() { var s=new Array(); for(var i=0;i<6000;i++) { s+=i+'sdfsdfsdf<br>'; } document.getElementById('content').innerHTML=s; //s=null; } </SCRIPT> <BUTTON onclick="aa();" >aa</BUTTON> <br> <div id="content"></div> </BODY> 请确认当循环60000时是你的cpu受不了,还是内存溢出. 内存占用是html,浏览器内容. 请大家打开上面页面, 看点击aa前和后内存占用. 新建个html,把6000个字符串拷贝到 <div id="content">6000个字符串</div> 打开看看. 当然,对于javascript,你的变量定义的位置有关系,你是在<head></head> <body></body> 函数内,全局的都有关系. ie最小化时,估计ms做过处理,最小化然后最大化,内容很少.??? |
|
返回顶楼 | |
发表时间:2006-01-06
关于Memory leak的问题,我以前在做Laszlo项目的时候遇到过,后来在他的论坛上找到这么一篇文章,希望对你有帮助。
根据我的经验,想要避免js的memory leak,可能和java的方式不相同,努力使对象尽快离开生命周期往往不奏效(照样溢出)。我倾向于维持js对象数目为可预知的。 就Laszlo而言,openlaszlo3.1以后addresses a number of memory leaks,同样的3.0上会溢出的js就不会溢出了。 通常意义上讲,js如何去写是至关重要的。 |
|
返回顶楼 | |
发表时间:2006-01-27
edge_hh 写道 <BODY> <P>Place bb.html's content here.</P> <SCRIPT> function aa(); { var number=new Array();; for(var i=0;i<60000;i++); { number[i]=i; } } function bb(); { var number=new Array();; for(var i=0;i<60000;i++); { number[i]=i; } } </SCRIPT> <BUTTON onclick="aa();;" >aa</BUTTON> <br> <BUTTON onclick="bb();;" >bb</BUTTON> </BODY> 上面这段代码,只要你一直点按钮,内存就一直往上涨。 而且不释放。(我等了10分钟) 无论ie还是firefox,你只有最小化窗口,内存才会释放。 这样的话,就有问题了。 假如用ajax实现一个应用,查询出一个大数组用来作为报表展现, 每次查询出的结果如果没有被浏览器垃圾收集。那多点几遍查询的话,很有可能内存溢出吧? 这个不是泄漏, 而是JavaScript回收策略问题, 内存不够时他自然会释放 我所知道的真正问题是COM 对象释放,比如: var x=new ActiveXObject("xxx"); document.body.myobj = x; 如果你有这样的代码, IE不会释放COM Reference, 即使你Navigate到另一个页面,仍然不会释放. 导致COM Object Reference 没有减为0. 你可以去google上search这个问题 |
|
返回顶楼 | |