[js][内存泄露][内存回收][内存释放]avascript的内存释放实验

来源:互联网 发布:win7下u盘安装ubuntu 编辑:程序博客网 时间:2024/05/01 14:58
问:
我以前也看过关于javascript的内存释放的文章,但我从来也没仔细看过。原因:一来我觉得这个东西可有可无,二来,鬼知道这些理论到底有没有科学根据?

今天我做了一个小小的实验,证实内存释放还是有用的。

比如有如下程序:
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:

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

**********************通过自己电脑亲自体验*********************************************************
****未加入内存释放段时,双击该测试页面,CPU利用率飙升,由4%-5%升至50%,内存使用增加2000多k,而后CPU利用率降低,但内存使用并不减少;若加上内存释放段,CPU使用情况不变,但内存会稍有减少,减少1000k 左右
**************************************************************************************************************

______________________________________________________________________________________________
答3:
学习
______________________________________________________________________________________________
答4:
回复:emu(ston)

是呀。我明明一个帖子,发出来以后居然不完全,所以我不得不又发了一个,接上。

真奇怪。。。
______________________________________________________________________________________________
答5:
质疑!

不见得。

用纯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分配另外的内存。



______________________________________________________________________________________________
答6:
PS:

1) 如果你在另一个window中keep了该window中的object,即使关闭该window,内存也没有释放

2)更糟糕的是,如果你keep的是一个DOM object, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)
______________________________________________________________________________________________
答7:
为了证实wsj(骆驼) 的观点,我又用IE打开了这个文件。555。6分钟内,我的cpu 99%的被占用。什么也干不了。

结果也是一样,在这六分钟内,我的系统可用内存逐步减少,然后又逐步增加。。。
其实大家也可以做的呀。。把上面的代码存为一个文件:test.html.然后用IE运行。然后机器就像死了一样。你马上用Ctr+Alt+Del打开监视器,看“性能”的“内存可用数。就可以看到这个结果,不过要有耐心哟。。

wsj(骆驼)说:”也就是说当你 a1=null 时 IE并没有释放内存“, 那么我将 an = null后,系统的可用内存却增加了。你怎么解释?
______________________________________________________________________________________________
答8:
To: lanbor
    你终于舍得回来看一下了!
______________________________________________________________________________________________
答9:
你一会儿汉语,一会而英语。我都糊涂了,什么叫做:另一个window中keep了该window中的object
______________________________________________________________________________________________
答10:
to meizz(梅花雨) .
是呀。好久没来了。你们都红星闪闪了。。。
我现在在研究linux.:)
______________________________________________________________________________________________
答11:
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 看看,我想一样会下去。


______________________________________________________________________________________________
答12:
//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");
//...

______________________________________________________________________________________________
答13:
--------------------------------------------------------------------------
回复:emu(ston)

是呀。我明明一个帖子,发出来以后居然不完全,所以我不得不又发了一个,接上。

真奇怪。。。
--------------------------------------------------------------------------

上回csdn改了xsl我就发现了这个问题了,给他们反映过,他们说测试过没有这个问题。可是我这里还是照旧。其实你帖的内容别人都看得见的,就在我们的浏览器上被截断显示了。害的我上回差点回答错了问题。

我的系统是2000professional英文版。浏览器IE5.00.3103.1100(英文版),你的呢?

这还有谁有相同问题吗?
______________________________________________________________________________________________
答14:
我也有,估计绝大多数人都有!
______________________________________________________________________________________________
答15:
:(....不和你辩了。您的English+Chinese我实在不知所云。什么载树,乘凉的。什么叫“去掉set null 看看,我想一样会下去”的。你自己试试不就完了吗???

我承认你的理论很“牛B”,可谁看得懂呀?

其实我的逻辑很简单呀:做了一个实验,加了=null后,系统的可用内存就多了,我就得出内存被释放了的结论。而我得出“可用内存多了”的结论是我在win2000里的任务管理器里看到的(Ctrl+Alt+del)。

其他的我就不知道了,对于系统机制我不懂。呵呵。
______________________________________________________________________________________________
答16:
:)

也不合你辨了,你的中文和人缘都比我好

何况人家好不容易回来一趟,我又和人家没仇

何苦落一个死缠烂打的美名,呵呵
______________________________________________________________________________________________
答17:
呵呵。也不是什么死缠烂打啦。。。。辩辩对大家都有好处的。我们来这里不就为了学习吗?你说呢?

我说过:
其实我的逻辑很简单呀:做了一个实验,加了=null后,系统的可用内存就多了,我就得出内存被释放了的结论。

我觉得这就像 1+1=2的逻辑一样简单呀?你能就这个实验本身作出说明吗?你也做一下实验看看呀,不要多少时间的。

不要走呀。接着说自己的理由,这是纯技术问题。没什么的。:)


______________________________________________________________________________________________
答18:
我想 这种问题,就我们俩的力量是不会有答案的。

这里有许多非常有经验的人,

大家都说话呀!
______________________________________________________________________________________________
答19:
http://expert.csdn.net/Expert/TopicView1.asp?id=1241212
______________________________________________________________________________________________
答20:
http://expert.csdn.net/Expert/topicview.asp?id=1041463
______________________________________________________________________________________________
答21:
Javascript uses garbage collection, to really recover memory, try the undocumented CollectGarbage() function
______________________________________________________________________________________________
答22:
yes, it's wonderful.

It's really i want.

不过有被JavaScript愚弄的感觉,我知道他的garbage collection机制,
怎么没有文档提过有这么个function

CollectGarbage!

wow, Let me try it first.


______________________________________________________________________________________________
答23:
CollectGarbage() 在第一个回复的时候就试过了,没什么效果
______________________________________________________________________________________________
答24:
感觉JAVASCRIPT版是最有活力的一个版
______________________________________________________________________________________________
答25:
to qiushuiwuhen(秋水无恨) :

对, 我做的sample也看不出。 可能还有其他未知因素。


to saucer(思归) : 能给个例子吗?
______________________________________________________________________________________________
答26:
还有,能说说我的这两个经验吗?

1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放

2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)

______________________________________________________________________________________________
答27:
关注
______________________________________________________________________________________________
答28:
<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">
______________________________________________________________________________________________
答29:
反正是client的事情,你开发网站的管它那么多做什么
______________________________________________________________________________________________
答30:
学习

______________________________________________________________________________________________
答31:
好!!!
______________________________________________________________________________________________
答32:
服!

P4 1.6G/512M/Win2000 server/IE6 测试数据:

n = 200
t1= 276560k
t2= 279768k
t3= 276904k

n = 300
t1= 275048k
t2= 285444k
t3= 276072k

n = 300
t1= 276640k
t2= 284976k
t3= 276816k

n = 500
t1= 276860k
t2= 309900k
t3= 277100k


n = 1000
t1= 277020k
not finished in 20min

还请回答我的另外一个问题
______________________________________________________________________________________________
答33:
有这么多的高手在讨论,学习!!!
______________________________________________________________________________________________
答34:
这只是一个简单的垃圾回收问题,如果做过编译器和bit解释器的人应该很熟悉这个原理,远离比较复杂,不过有一点是一定的javascript不会主动释放内存!这个主要同性能要求有关,其实javascript是可以做到自动释放内存的。但是现在的解释核心都没有这样去做,jscript的内存释放机制还是可以的,但是仍然不会主动释放所有内存(可能会释放部分内存)
______________________________________________________________________________________________
答35:
还是没有解决楼主的问题,只是转移了矛盾,将“指针”在数组中丢弃罢了

<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">


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

不过,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.

为什么说他不会主动调用呢?
______________________________________________________________________________________________
答38:
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程序结束的时候才会
>>调用.这样才是安全的
你说是不是:)





______________________________________________________________________________________________
答39:
值得说明的是JScript并不是javascript,他们中间有很多显著的不同点,而且很多是本质上的。
______________________________________________________________________________________________
答40:
如果不释放内存,关闭网页或跳到别的网页上,内存不会自动释放吗?

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

能解释一下:
1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放

2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)

吗?
______________________________________________________________________________________________
答43:
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.

______________________________________________________________________________________________
答44:
我对这个问题专门研究了很长时间,是在IE5以上的浏览器做的。不关闭浏览器也不跳转到新网页时,浏览器不会主动释放脚本语言程序中的申请的内存,但跳转到新网页会,但这个释放有些特别(我记不清楚了,好象不是一下就全部释放)
______________________________________________________________________________________________
答45:
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中,这个就不好断定。
______________________________________________________________________________________________
答46:
to wanderinrain(迷失在雨中)
我认为是没有释放,不可能通过监视内存的变化来判断内存是否被释放了,因为这里还有很多的com对象需要释放和创建。比如dom之类的。这些内存的变动直接导致了判断的失误。实际上真正的javascript内存的完全释放是要发生在解释核心的重新加载或delete的时候,其他的时候的释放都是危险的和不被推荐的.
______________________________________________________________________________________________
答47:
我猜啊^_^,一点道理都没有。

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

纯属胡猜啊:)


______________________________________________________________________________________________
答48:
上次我去问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的内存.对着任务管理器才看到情况)


______________________________________________________________________________________________
答49:
我想,我们的语言交流出现了问题:


我再描述一遍:


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, 报内存错误(或者要求,重新启动)

______________________________________________________________________________________________
答50:
猜的就是不准,看来我又错了。
______________________________________________________________________________________________
答51:
to Lostinet(迷失网络)

your code:
--------------------
//明显,已经释放了。
r=null;
---------------------

这个r不是你的Nested Function r


function A(a)
{
    a=null;
    return r;
    function r()
    {
    }   
}
这个r只在A中可见(private)
______________________________________________________________________________________________
答52:
to wsj(骆驼) ( ) 信誉:100
你的描述,我彻底糊涂了,不过有一点可以肯定r=null这种用法,在标准的javascript中应该不会导致内存被释放,当然我也会客观地说在 jscript中,内存确实会可能释放,但是也是相当不确定。另外上面的一位兄弟说的数组问题显然不是这个问题的答案,在解释核心中都是动态申请这些东西的,通常用malloc(特别注意不是new)因此也就不存在数组问题了。
______________________________________________________________________________________________
答53:
to Lostinet(迷失网络)
嵌套函数如果不掉用内存回收函数就不会释放内存,其实我可以肯定地告诉正常情况下,javascript不会回收任何正在运行脚本申请的内存,释放只是在推出或者重新初始化的时候,还有就是调用垃圾回收函数(千万别用)。jscript有另外的策略,但是你必须要知道jscript不遵循任何 javascript的标准,它是独立的一种标准。
其实从javascript角度说,如果你真的联系了jscript开发组,那么他们的回答同我的回答都一样,就是递归调用不会释放任何空间。
______________________________________________________________________________________________
答54:
up
______________________________________________________________________________________________
答55:
我写了一个parseColor(color)函数,利用的是IE中的td对象的bgColor属性的解释颜色代码的功能。如果IE中JScript中有释放内存的功能的话。那么下面这种写法应该比较好:
<script language="JScript">
function parseColor(color) {
    var ColorParser = document.createElement("td");
    ColorParser.bgColor = color;
    return ColorParser.removeNode().bgColor;
}
</script>
可是如果不能释放内存的话,是不是这样写更好一些:
<script language="JScript">
var ColorParser = document.createElement("td");
function parseColor(color) {
    ColorParser.bgColor = color;
    return ColorParser.bgColor;
}
</script>

我也不知道这两种写法那种更好。redpower能不能解释一下哪种更好呢?
______________________________________________________________________________________________
答56:
to andot
这个同IE的jscript是否释放内存关系不大,而且我要纠正的是JScript肯定有GC功能,而不是你的意思,就你的代码来看,我看如何用没有什么区别,因为你没有频繁创建对象

______________________________________________________________________________________________
答57:
如果用第一种写法的话,每调用一次这个函数,对象就会被创建一次(当然之后被remove了,可是谁知道这个removeNode有没有起作用释放内存的作用),如果removeNode没有释放内存的话,那么如果程序中频繁调用parseColor这个函数的话,岂不是内存就越来越少了?
______________________________________________________________________________________________
答58:
>>>>1) 如果你在另一个window中keep了该window中的object的reference,即使关闭该window,内存也没有释放

As you might know, windows opened with window.open() may share a process with its opener (_blank or _new window may not). That is, even if you see those two windows on the desktop, if you look at the process table in the Task Manager, you may only see one IEXPLORE.EXE running. Memory may only be released when the process is terminated

>>>>2)更糟糕的是,如果你keep的是一个DOM object的reference, 关闭该object 所在window, IE会crash, 报内存错误(或者要求,重新启动)

I would say this looks like a bug, you might want to report to Microsoft

______________________________________________________________________________________________
答59:
学习!
______________________________________________________________________________________________
答60:
to andot(雨飞)
我前面说过了,Javascript是不会主动在程序没有结束前去执行GC功能的(我不是说其他JavaScript实现肯定会遵循这个,比如 JScript就是一个例外,主要原因是这个东西根本就不遵循JavaScript规范)因此,这个地方你无论如何写,如果他真的为这个对象分配内存了,那么就不会释放掉。其实远不止建立对象会这样,比如执行一个字符串转换为整数的函数,他就会建立一个“可变类型对象“而这个对象是不会再函数执行完毕后释放(因为是传值的而不是传址的)所以如下代码如果JavaScript支持,则会占用大量内存:
var a=1234;
for(var i=0;i<10000000;i++)
{
    println(a);
}
至少现在大多数的JavaScript实现都会有这个问题,当然JScript不会存在这个问题,因为它不执行JavaScript规范的要求。
下面的就不会有问题
var a=1234;
var b="1234";
for(var i=0;i<10000000;i++)
{
    println(b);
}
这个无论什么实现,基本都不会有内存增加的问题
我这样说你应该明白了吧

______________________________________________________________________________________________
答61:
to redpower(常宁)
你的意思是不是说,JScript的垃圾收集机制与JavaScript不一样,比如我的那个函数:
function parseColor(color) {
    var ColorParser = document.createElement("td");
    ColorParser.bgColor = color;
    return ColorParser.removeNode().bgColor;
}
在执行完成以后,不会增加文档中的对象数目,是不是啊?(我的意思是,removeNode是否真的把createElement的td给移除了,哪怕是做了标记,下次再调用时createElement时,会利用以标记的这个对象的空间也可以啊。)
哦,对了,我可以做个实验看看。
______________________________________________________________________________________________
答62:
to andot(雨飞)
由于我仅仅对JavaScript核心进行开发,而JScript不是一个开放的标准因此,我无法说明JScript的GC的内部实现原理,至于是否真的会增加数量需要微软的解释,不过M$似乎会控制对象的数量,它一般会将这个创建对象达到一定程度后,进行强制性的内存回收,因此如果打算循环 10000000次来看内存是否有很大增长似乎并不现实,当然我指的是JScript,而对于JavaScript这个方法通常应该是有效的
______________________________________________________________________________________________
答63:
测试结果虽然没有发现removeNode是否起了作用(因为不论是否加上removeNode,内存的使用都没有增加,看来JScript的垃圾回收机制确实很好!)但是测试结果表明第一种写法要比第二种写法慢好多(看来createElement确实花费很多的时间)。所以我觉得还是改成第二种写法好。
______________________________________________________________________________________________
答64:
to andot(雨飞)
其实JScript的内存回收机制是在牺牲性能的情况下换取的,他的性能要比其他的实现慢进一个数量级,其他的解释核心的实现是编译+bit虚拟机,就类似java一样,他的就不是那么简单,他也要编译,但是运行就不同了。因此不能说他的回收机制很好,只不过大家的取舍不一样而已,我更喜欢 javascript的方式,而不是jscript的方式。你的实验我没做过,不过我看好像在javascript也不会因为createElement 而占用大量内存
______________________________________________________________________________________________
答65:
这么多高手,学习。
______________________________________________________________________________________________
答66:

角角多,星星多多!
______________________________________________________________________________________________
答67:
高手就是高手
______________________________________________________________________________________________
答68:
FAINT
楼主梭说的释放是什么意思?
=========================
产生那么多实例,是要花些时间,占些内存是应该的。
你用EditPlus运行后,不关掉那页,内存怎么释放,如果IE都关掉了,内存还是居高不下,那时释放的问题,好好升级的得IE。如果你的系统还是慢得象蜗牛,你盖重新启动机器了,多半是出现了内存碎片,在堆里创建那么多小东西,再删除,够乱的.

=========================
我现在还是没明白楼主说什么呢?
______________________________________________________________________________________________
答69:
楼主说的大概是在js运行过程中动态的强行释放不再引用的对象占用的内存吧,关掉了IE后的内存问题咱们javascript版又能有什么办法?
______________________________________________________________________________________________
答70:
哈哈.没想到我的一个小帖子招来这么多高手讨论.:)

其实我的帖子可以简化的得出下面的结论:(数据是虚拟和简化了的,旨在说明问题)

1) 假如你的系统开始有100K的可用内存.
2) 用户用IE打开你的页面,执行一段JS脚本.
3) 当执行到 a = new Array();
4) 这时用户的系统只有90K的可用内存了.
5) 当执行到 a = null 后
6) 这时用户的系统有95K的可用内存了.

就是说,假如一个用户打开了你的网页,运行了你的脚本.(正在浏览,没关闭!!)..如果你的脚本没有加a =null; 那么他就只有90K的内存可以做别的事情,比如又打开Photoshop软件绘图.如果你的脚本加了a=null;他就可能就有95K的内存可以用 Photoshop了.

我说的都是IE没有关闭的情况.(设想,他可能正照着这个网页在photoshop里绘图).至于关了IE是什么情况,我没做实验.

所以,不管你知不知道原理,如果你的脚本里有大量的Array.不妨用完以后加上=null.这样会给你的用户带来一点点好处.:)....
______________________________________________________________________________________________
答71:
搂主打算什么时候结帖呀?
______________________________________________________________________________________________
答72:
题外话,楼主的心工作怎么样,呵呵,QQ见不到你了。
希望js工作组在下一代的js中支持某种意义上的重载,这样很多不完善的地方就可以有csdn的朋友们来完善了。:)
原创粉丝点击