避免大规模垃圾收集

时间:2014-01-02 21:27:28

标签: javascript memory-management garbage-collection

这是一个大致了解如何避免这种情况的问题。我有可能有数以百万计的东西,每个东西都有几个花车。我必须遍历所有这些,并且在循环内部我必须进行一些计算。

这是这样的:

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);
}

我发现我的内存使用量爆炸到数百兆,浏览器崩溃了。正如你所看到的,我不需要做什么,但我只需要在很多事情上做。我发现浏览器正确垃圾收集临时浮动并且我的内存使用率迅速下降,但这是假设浏览器没有先崩溃。

任何想法如何让浏览器定期进行垃圾收集(或者某些类似的解决方案),这样我最终不会有大量的内存崩溃浏览器?

3 个答案:

答案 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);
}

更新您正在更新的第一个缓冲区