论坛首页 AJAX版 JavaScript

有关js的垃圾回收的问题

浏览 4604 次
精华帖 (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.javaeye.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
[code:1]<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>[/code:1]

上面这段代码,只要你一直点按钮,内存就一直往上涨。
而且不释放。(我等了10分钟)
无论ie还是firefox,你只有最小化窗口,内存才会释放。

这样的话,就有问题了。
假如用ajax实现一个应用,查询出一个大数组用来作为报表展现,
每次查询出的结果如果没有被浏览器垃圾收集。那多点几遍查询的话,很有可能内存溢出吧?
   
0 请登录后投票
时间: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做过处理,最小化然后最大化,内容很少.???
   
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 写道
[code:1]<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>[/code:1]

上面这段代码,只要你一直点按钮,内存就一直往上涨。
而且不释放。(我等了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 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐