比如有如下程序:
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也不会占用多少时间的,但的确是一个好习惯 :)

解决方案 »

  1.   

    lanbor(兰波):你的浏览器显示帖子的时候是不是也老是把问题部分截断了显示?
      

  2.   

    回复:emu(ston)是呀。我明明一个帖子,发出来以后居然不完全,所以我不得不又发了一个,接上。真奇怪
      

  3.   

    质疑!不见得。用纯IE做测试看看?我得概念是 :1)一个"window"永远不会释放内存,直到它被关闭
    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分配另外的内存。
      

  4.   

    PS:1) 如果你在另一个window中keep了该window中的object,即使关闭该window,内存也没有释放2)更糟糕的是,如果你keep的是一个DOM object, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)
      

  5.   

    为了证实wsj(骆驼) 的观点,我又用IE打开了这个文件。555。6分钟内,我的cpu 99%的被占用。什么也干不了。结果也是一样,在这六分钟内,我的系统可用内存逐步减少,然后又逐步增加
    其实大家也可以做的呀。。把上面的代码存为一个文件:test.html.然后用IE运行。然后机器就像死了一样。你马上用Ctr+Alt+Del打开监视器,看“性能”的“内存可用数。就可以看到这个结果,不过要有耐心哟。。wsj(骆驼)说:”也就是说当你 a1=null 时 IE并没有释放内存“, 那么我将 an = null后,系统的可用内存却增加了。你怎么解释?
      

  6.   

    To: lanbor
        你终于舍得回来看一下了!
      

  7.   

    你一会儿汉语,一会而英语。我都糊涂了,什么叫做:另一个window中keep了该window中的object
      

  8.   

    to  meizz(梅花雨) .
    是呀。好久没来了。你们都红星闪闪了
    我现在在研究linux.:)
      

  9.   

    1) can you say: if timepassed(a+=" ") == 0.001ms then 
    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 看看,我想一样会下去。
     
      

  10.   

    //keep object reference:
    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");
    //...
      

  11.   

    --------------------------------------------------------------------------
    回复:emu(ston)是呀。我明明一个帖子,发出来以后居然不完全,所以我不得不又发了一个,接上。真奇怪
    --------------------------------------------------------------------------上回csdn改了xsl我就发现了这个问题了,给他们反映过,他们说测试过没有这个问题。可是我这里还是照旧。其实你帖的内容别人都看得见的,就在我们的浏览器上被截断显示了。害的我上回差点回答错了问题。我的系统是2000professional英文版。浏览器IE5.00.3103.1100(英文版),你的呢?这还有谁有相同问题吗?
      

  12.   

    :(....不和你辩了。您的English+Chinese我实在不知所云。什么载树,乘凉的。什么叫“去掉set null 看看,我想一样会下去”的。你自己试试不就完了吗???我承认你的理论很“牛B”,可谁看得懂呀?其实我的逻辑很简单呀:做了一个实验,加了=null后,系统的可用内存就多了,我就得出内存被释放了的结论。而我得出“可用内存多了”的结论是我在win2000里的任务管理器里看到的(Ctrl+Alt+del)。其他的我就不知道了,对于系统机制我不懂。呵呵。
      

  13.   

    呵呵。也不是什么死缠烂打啦。辩辩对大家都有好处的。我们来这里不就为了学习吗?你说呢?我说过:
    其实我的逻辑很简单呀:做了一个实验,加了=null后,系统的可用内存就多了,我就得出内存被释放了的结论。我觉得这就像 1+1=2的逻辑一样简单呀?你能就这个实验本身作出说明吗?你也做一下实验看看呀,不要多少时间的。不要走呀。接着说自己的理由,这是纯技术问题。没什么的。:)
      

  14.   

    http://expert.csdn.net/Expert/TopicView1.asp?id=1241212
      

  15.   

    http://expert.csdn.net/Expert/topicview.asp?id=1041463
      

  16.   

    Javascript uses garbage collection, to really recover memory, try the undocumented CollectGarbage() function
      

  17.   

    yes, it's wonderful.It's really i want.不过有被JavaScript愚弄的感觉,我知道他的garbage collection机制,
    怎么没有文档提过有这么个functionCollectGarbage!wow, Let me try it first.
      

  18.   

    CollectGarbage() 在第一个回复的时候就试过了,没什么效果
      

  19.   

    感觉JAVASCRIPT版是最有活力的一个版
      

  20.   

    to qiushuiwuhen(秋水无恨) : 对, 我做的sample也看不出。 可能还有其他未知因素。
    to saucer(思归) : 能给个例子吗?
      

  21.   

    还有,能说说我的这两个经验吗?1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)
      

  22.   

    <script language="javascript">
    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">
      

  23.   

    反正是client的事情,你开发网站的管它那么多做什么
      

  24.   

    服!P4 1.6G/512M/Win2000 server/IE6 测试数据:n = 200
    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还请回答我的另外一个问题
      

  25.   

    这只是一个简单的垃圾回收问题,如果做过编译器和bit解释器的人应该很熟悉这个原理,远离比较复杂,不过有一点是一定的javascript不会主动释放内存!这个主要同性能要求有关,其实javascript是可以做到自动释放内存的。但是现在的解释核心都没有这样去做,jscript的内存释放机制还是可以的,但是仍然不会主动释放所有内存(可能会释放部分内存)
      

  26.   

    还是没有解决楼主的问题,只是转移了矛盾,将“指针”在数组中丢弃罢了<script language="javascript">
    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">
      

  27.   

    不用浪费无用功了,GC函数不能随意调用,它是没有选择性的,也是就说它不能有效判定对象是否有用,使用GC函数是极不安全的。原理可以在java的解释器的原理中得到验证,正是因为这个原因,所以没有任何一个javascript解释核心会在程序运行中主动调用这个函数(如果可以随意调用当然javascript解释核心早就实现了),通常这个函数会在核心推出内存,因就是IE或NS程序结束的时候才会调用.这样才是安全的,javascript通常是座小程序的,因此不必为占用内存而担心。我虽然不是做javascript程序的,我是做javascript解释核心的。所以,请大家听我的劝告把。
      

  28.   

    楼上的,我们这里太需要你这样的人来说几句了。
    欢迎以后常来,多和大家唠唠:)不过,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.为什么说他不会主动调用呢?
      

  29.   

    to  wsj(骆驼)
    你说的这个是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程序结束的时候才会
    >>调用.这样才是安全的
    你说是不是:)
      
     
      

  30.   

    值得说明的是JScript并不是javascript,他们中间有很多显著的不同点,而且很多是本质上的。
      

  31.   

    to sunmingdong() ( ) 
    这个同解释器没有关系,是否释放关键是在寄主身上,反正不会影响什么,毕竟javascript都是些小程序,而且不会也不应该有频繁的内存申请,当然编成风格不好的程序除外。据我所知好像IE合NS都不会在程序退出前释放。
      

  32.   

    to redpower(常宁) 能解释一下:
    1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)吗?
      

  33.   

    to wsj(骆驼) ( ) 信誉:100  2002-12-12 13:05:00  得分:0 
    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.
      

  34.   

    to wsj(骆驼) ( ) 信誉:100  2002-12-12 13:05:00  得分:0 
    比较奇怪的是你如何知道(如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放)因为如果IE没有退出去前,你不知道是否释放了(应该是没有释放,从理论上也应该是这样),而退出去后,如果没有释放,则就是内存泄漏,应该是一个关键的BUG,所以我认为你的判断可能有错误。
    第二个你是如何关闭Object所在的window的?在javascript中你不可能用delete删除实例,关闭windows不会导致windows对象的消失。这个对象什么时候从内存中消失,我认为在javascript中,基本上不会消失,在jscript中,这个就不好断定。
      

  35.   

    to  wanderinrain(迷失在雨中) 
    我认为是没有释放,不可能通过监视内存的变化来判断内存是否被释放了,因为这里还有很多的com对象需要释放和创建。比如dom之类的。这些内存的变动直接导致了判断的失误。实际上真正的javascript内存的完全释放是要发生在解释核心的重新加载或delete的时候,其他的时候的释放都是危险的和不被推荐的.
      

  36.   

    我猜啊^_^,一点道理都没有。是不是IE分配的时候Array分配的大一点,而null也分配,但是分配的要小一点,或者几乎不占内存(因为我觉得a{i}),这样就会出现楼主的现象,原因是IE重新给它分配了小的内存,所以内存会降下来,而当CG的时候,会将所有为null的变量都销毁。这个样子?纯属胡猜啊:)
      

  37.   

    上次我去问JScript的开发小组,他们说如果Nested Function没有被释放,
    那么所有上级函数的参数即使设为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的内存.对着任务管理器才看到情况)
      

  38.   

    我想,我们的语言交流出现了问题:
    我再描述一遍:
    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, 报内存错误(或者要求,重新启动)