这是一个大致了解如何避免这种情况的问题。我有可能有数以百万计的东西,每个东西都有几个花车。我必须遍历所有这些,并且在循环内部我必须进行一些计算。
这是这样的:
for (var i = 0; i < 10000000; i++) {
var num1 = thing[i].x * something;
var num2 = thing[i].y * somethingElse;
buffer.push(num1);
buffer.push(num2);
var num3 = thing[i].z * something;
var num4 = thing[i].w * somethingElse;
buffer2.push(num3);
buffer2.push(num4);
}
我发现我的内存使用量爆炸到数百兆,浏览器崩溃了。正如你所看到的,我不需要做什么,但我只需要在很多事情上做。我发现浏览器正确垃圾收集临时浮动并且我的内存使用率迅速下降,但这是假设浏览器没有先崩溃。
任何想法如何让浏览器定期进行垃圾收集(或者某些类似的解决方案),这样我最终不会有大量的内存崩溃浏览器?
答案 0 :(得分:2)
如果你有逻辑女巫是可重复的,那就动态地做......当你真正需要的时候创造所需的价值:
有点:http://jsfiddle.net/acrashik/qdxLv/2/
var something = 10, somethingElse = 20;
function buffer(i){
var num1 = thing(i).x * something;
var num2 = thing(i).y * somethingElse;
return [num1, num2];
}
function thing(i){
return {x: i*10,y:i*1.5};
}
//get needed value
buffer(20);
alert(buffer(20))
答案 1 :(得分:1)
你可以尝试在函数范围内部分进行,没有尝试过这种特殊情况,但是一旦超出范围,变量就会被垃圾收集:
function doPortion(nFrom, nTo) {
for (var i = nFrom; i < nTo; i++) {
var num1 = thing[i].x * something;
var num2 = thing[i].y * somethingElse;
buffer.push(num1);
buffer.push(num2);
var num3 = thing[i].z * something;
var num4 = thing[i].w * somethingElse;
buffer2.push(num3);
buffer2.push(num4);
}
}
var nStep = 1000;
for (var n=0; n<10000000-nStep; n += nStep) {
doPortion(n, n+nStep);
}
答案 2 :(得分:0)
通过两次内存消耗来减少这种情况,只需将第二个缓冲区链接到第一个;
var buffer = [];
var buffer2 = buffer;
for (var i = 0; i < 10000000; i++) {
var num1 = thing[i].x * something;
var num2 = thing[i].y * somethingElse;
buffer.push(num1);
buffer.push(num2);
}
更新您正在更新的第一个缓冲区