比如有如下程序:
var a = new Array();
..........一般a用完了就完了,谁也不会想到去释放a所占用的内存。设想代码:
var a = new Array();
..........
a = null;有没有用呢?我做了一个实验:在editplus中编写如下代码:
<HTML>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
//------ 使用内存段
for (var i = 0; i < 100000; i++)
{
eval("a" + i + "= new Array();");
}
//--------释放内存段
for (var i = 0; i < 100000; i++)
{
eval("a" + i + "= null;");
}</SCRIPT>
</BODY>
</HTML>Ctrl+B 运行这个文件以后,我打开win2000的系统监视器,看系统的内存使用情况。结果如下:在editplus不运行这个网页前,占用的内存大概为8000多K,如果没有加上释放内存段,运行后editplus大概要运行2-3分钟才完成,内存使用数逐步上升,最终占用内存为24000多K时.而加上了释放内存段的代码后,editplus在开始的2-3分钟内,内存也逐步上升,到了24000多K后,内存占用量开始下降,在接下来的2-3分钟内,内存使用量逐步降到了15000多K.结论,a = new Array()后, a = null; 释放的确还是有用的,特别是对大型网站。当然,也不是完全释放,比使用前还是要多占一些内存的。 其实,在用完一个数组后,加一个 = null也不会占用多少时间的,但的确是一个好习惯 :)
2)set null, or delete , only mean nofity IE that it's garbage, if any other object need allocate memory, just using this hole也就是说当你 a1=null 时 IE并没有释放内存而是当你下一次b=new Array()时会“覆盖”被标记为“删除”的内存
当然,如果没有set null,或delete, IE会为b分配另外的内存。
其实大家也可以做的呀。。把上面的代码存为一个文件:test.html.然后用IE运行。然后机器就像死了一样。你马上用Ctr+Alt+Del打开监视器,看“性能”的“内存可用数。就可以看到这个结果,不过要有耐心哟。。wsj(骆驼)说:”也就是说当你 a1=null 时 IE并没有释放内存“, 那么我将 an = null后,系统的可用内存却增加了。你怎么解释?
你终于舍得回来看一下了!
是呀。好久没来了。你们都红星闪闪了
我现在在研究linux.:)
timepassed(loop 10000000: a+=" ") == 1m ?
2)
for (i=1;i<=10000;i++)
factorial *= i
will never get correct resul
3) 不要忘记前人载树,后人乘凉。鬼才知道我家的电视机到底是怎么显示图像的,
4)你只看到memory下去了,说不定,有太多的优化动作在里面。
5)去掉set null 看看,我想一样会下去。
window.open("about:<script>a=new Array("a","b");</script>","b");
//...
c=b.a;
//...//keep DOM object reference:
window.open("about:<button id=a>me</button>","b");
//...
c=b.document.getElementById("a");
//...
回复:emu(ston)是呀。我明明一个帖子,发出来以后居然不完全,所以我不得不又发了一个,接上。真奇怪
--------------------------------------------------------------------------上回csdn改了xsl我就发现了这个问题了,给他们反映过,他们说测试过没有这个问题。可是我这里还是照旧。其实你帖的内容别人都看得见的,就在我们的浏览器上被截断显示了。害的我上回差点回答错了问题。我的系统是2000professional英文版。浏览器IE5.00.3103.1100(英文版),你的呢?这还有谁有相同问题吗?
其实我的逻辑很简单呀:做了一个实验,加了=null后,系统的可用内存就多了,我就得出内存被释放了的结论。我觉得这就像 1+1=2的逻辑一样简单呀?你能就这个实验本身作出说明吗?你也做一下实验看看呀,不要多少时间的。不要走呀。接着说自己的理由,这是纯技术问题。没什么的。:)
怎么没有文档提过有这么个functionCollectGarbage!wow, Let me try it first.
to saucer(思归) : 能给个例子吗?
var pt = null;function allocMem()
{
//try n=1000 or 10000 if you have patience
var n = 200;
pt = new Array(n);
for (var i=0; i < n; i++)
{
pt[i] = new Array(n);
for (var j=0; j < n; j++)
pt[i][j] = (i*j)+"";
}
}function callGC()
{
pt = null;
CollectGarbage();
}
</script>
You'd better open the task manager and watch the memory usage. <BR>
If you do not see the effect, use a larger n<BR>
<input type="button" onclick="allocMem()" value="use memory">
<input type="button" onclick="callGC()" value="use GC">
t1= 276560k
t2= 279768k
t3= 276904kn = 300
t1= 275048k
t2= 285444k
t3= 276072kn = 300
t1= 276640k
t2= 284976k
t3= 276816kn = 500
t1= 276860k
t2= 309900k
t3= 277100k
n = 1000
t1= 277020k
not finished in 20min还请回答我的另外一个问题
var n = 20000;function allocMem()
{
for (var i = 0; i < n; i++)
{
eval("a" + i + "= new Array();");
}
}function callGC()
{
for (var i = 0; i < n; i++)
{
eval("a" + i + "= null;");
} CollectGarbage();
}
</script>
You'd better open the task manager and watch the memory usage. <BR>
If you do not see the effect, use a larger n<BR>
<input type="button" onclick="allocMem()" value="use memory">
<input type="button" onclick="callGC()" value="use GC">
欢迎以后常来,多和大家唠唠:)不过,MSDN上说:When the script engine is shut down, garbage is collected.When 256 variants, or more than 64KB of strings, or more than 4096 array slots have been allocated, the garbage collector sets a flag that says collect soon.Whenever a new statement is executed or the script debugger starts, that flag is checked, and if it is set, a collection is done.为什么说他不会主动调用呢?
你说的这个是jscript的,我说过:
>> redpower(常宁) ( ) 信誉:100 2002-12-12 11:08:00 得分:0
>> 这只是一个简单的垃圾回收问题,如果做过编译器和bit解释器的人
>>应该很熟悉这个原理,远离比较复杂,不过有一点是一定的javascript不
>>会主动释放内存!这个主要同性能要求有关,其实javascript是可以做到
>>自动释放内存的。但是现在的解释核心都没有这样去做,jscript的内存
>>释放机制还是可以的,但是仍然不会主动释放所有内存(可能会释放
>>部分内存)
这并不与我的论点相左,而是证明了我的论点
(When 256 variants, or more than 64KB of strings, or more than 4096 array slots have been allocated, the garbage collector sets a flag that says collect soon.)
(When the script engine is shut down, garbage is collected.)这个则是证明了我下面的论述:
>>通常这个函数会在核心推出内存,因就是IE或NS程序结束的时候才会
>>调用.这样才是安全的
你说是不是:)
这个同解释器没有关系,是否释放关键是在寄主身上,反正不会影响什么,毕竟javascript都是些小程序,而且不会也不应该有频繁的内存申请,当然编成风格不好的程序除外。据我所知好像IE合NS都不会在程序退出前释放。
1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)吗?
1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)这两个问题同解释核心的原理应该没有什么关系,这基本上只有在JScript上才会出现(我不能肯定是否是bug).
垃圾回收机制的垃圾判断算法比较复杂,而且十分矛盾,因此会有一些取舍。换句话说就是很难判断一个对象是否还有存在的价值。abc=NULL这种方式并不是java或javascript必需的,是否加上这个要看个人习惯,而且还要看使用的解释核心是否会认为这表示一个对象生命的终结,如果这个方式可靠,也就不会在 java或javascript中取消delete.
比较奇怪的是你如何知道(如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放)因为如果IE没有退出去前,你不知道是否释放了(应该是没有释放,从理论上也应该是这样),而退出去后,如果没有释放,则就是内存泄漏,应该是一个关键的BUG,所以我认为你的判断可能有错误。
第二个你是如何关闭Object所在的window的?在javascript中你不可能用delete删除实例,关闭windows不会导致windows对象的消失。这个对象什么时候从内存中消失,我认为在javascript中,基本上不会消失,在jscript中,这个就不好断定。
我认为是没有释放,不可能通过监视内存的变化来判断内存是否被释放了,因为这里还有很多的com对象需要释放和创建。比如dom之类的。这些内存的变动直接导致了判断的失误。实际上真正的javascript内存的完全释放是要发生在解释核心的重新加载或delete的时候,其他的时候的释放都是危险的和不被推荐的.
那么所有上级函数的参数即使设为null,即使使用CollectGarbage都不会释放内存。
看来是误导我。(或是版本问题?)
<script>//32M
function AllocMem()
{
var str="12345678";
for(var i=3;i<24;i++)
str+=str;
return str;
}function A(a)
{
a=null;
return r;
function r()
{
}
}
var f=A(AllocMem());
alert(1);
CollectGarbage();
//明显,已经释放了。
r=null;
alert(2);
CollectGarbage();</script>----------
这是我做的例子
http://www.lostinet.com/public/VariablesScopeRecursion.html
里面对于内存释放的规则(脚本层)已经理解得很透了。
(每一层菜单分配?M的内存.对着任务管理器才看到情况)
我再描述一遍:
1) 假设user open了一个IE window, input your page one url: page1.htm,然后你在page1中创建了a=new Array(...);并且在客户的内存上涨了10M, 然后page1.htm中的脚本用window.open("page2.htm")打开了page2.htm,然后你的page2.htm中的脚本说b=widnow.opener.a;接着user关闭了你的page1 IE窗口.问:上涨的哪10M内存会否释放?
答:不会,但如果没有打开page2.htm,会释放2)同上,但b=window.opener.document.body, 关闭page1, 问:又会怎样?
答:往往IE会crash, 报内存错误(或者要求,重新启动)