论坛首页 Web前端技术论坛

有关js的垃圾回收的问题

浏览 12248 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-12-29  
现在想用js实现一个类似eclipse的java视图的界面,即左边是树,右边是多页签窗体,上面是menu的页面。
        由于页签是可以动态添加和动态关闭的,而每个页签所展示的内容都比较复杂。
        现在比较担心js的内存回收会不会有问题。
        比如一个用户打开10个页签,关掉,再打开另外十个页签。这样会不会造成浏览器占用20个页签的内存?
        这样到最后会不会就出问题了?
       
        我随便写了个方法,方法内用数组申请了很大的一块内存。
        在方法执行完都没有发现内存被释放。(IE和firefox都是)
        实际上那个数组的生命周期早已结束。
       
        这样的话js+dom构造界面在项目中大量采用会很麻烦吧?
       
        有经验的请提示一下,谢谢
   发表时间: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>,每个页签的内容不要由主页面控制.
我现在的项目就这样做的.
0 请登录后投票
   发表时间:2005-12-29  
请问zkj_beyond,div中的iframe内容如果狠多,高度如何动态控制?
0 请登录后投票
   发表时间: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/
0 请登录后投票
   发表时间:2005-12-29  
感觉好像狠复杂。。。
0 请登录后投票
   发表时间:2005-12-30  
关注ing,js得生命周期控制确实挺重要得
0 请登录后投票
   发表时间: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实现一个应用,查询出一个大数组用来作为报表展现,
每次查询出的结果如果没有被浏览器垃圾收集。那多点几遍查询的话,很有可能内存溢出吧?
0 请登录后投票
   发表时间:2005-12-31  
&lt;BODY&gt;
&lt;P&gt;Place bb.html's content here.&lt;/P&gt;
&lt;SCRIPT&gt;
function aa()
{
       
        var s=new Array();
        for(var i=0;i&lt;6000;i++)
        {
                s+=i+'sdfsdfsdf&lt;br&gt;';
        }

document.getElementById('content').innerHTML=s;
//s=null;
}
&lt;/SCRIPT&gt;

&lt;BUTTON onclick="aa();" &gt;aa&lt;/BUTTON&gt;
&lt;br&gt;
&lt;div id="content"&gt;&lt;/div&gt;

&lt;/BODY&gt;

请确认当循环60000时是你的cpu受不了,还是内存溢出.

内存占用是html,浏览器内容. 请大家打开上面页面,
看点击aa前和后内存占用.
新建个html,把6000个字符串拷贝到
&lt;div id="content"&gt;6000个字符串&lt;/div&gt; 打开看看.

当然,对于javascript,你的变量定义的位置有关系,你是在&lt;head&gt;&lt;/head&gt;
&lt;body&gt;&lt;/body&gt; 函数内,全局的都有关系.

ie最小化时,估计ms做过处理,最小化然后最大化,内容很少.???
0 请登录后投票
   发表时间:2006-01-06  
关于Memory leak的问题,我以前在做Laszlo项目的时候遇到过,后来在他的论坛上找到这么一篇文章,希望对你有帮助。

根据我的经验,想要避免js的memory leak,可能和java的方式不相同,努力使对象尽快离开生命周期往往不奏效(照样溢出)。我倾向于维持js对象数目为可预知的。

就Laszlo而言,openlaszlo3.1以后addresses a number of memory leaks,同样的3.0上会溢出的js就不会溢出了。

通常意义上讲,js如何去写是至关重要的。
0 请登录后投票
   发表时间: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这个问题
0 请登录后投票
论坛首页 Web前端技术版

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