Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 避免大规模垃圾收集_Javascript_Memory Management_Garbage Collection - Fatal编程技术网

Javascript 避免大规模垃圾收集

Javascript 避免大规模垃圾收集,javascript,memory-management,garbage-collection,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 =

这是一个如何避免这种情况的问题。我有可能数以百万计的东西,每个都有一些浮动。我必须迭代所有这些,在循环中我必须做一些计算

是这样的:

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);
}
for(变量i=0;i<10000000;i++){
var num1=thing[i].x*thing;
var num2=thing[i].y*somethingElse;
buffer.push(num1);
缓冲推送(num2);
var num3=thing[i].z*thing;
var num4=thing[i].w*somethingElse;
缓冲器2.推力(num3);
缓冲2.推送(num4);
}
我发现我的内存使用量激增到数百兆字节,浏览器崩溃。正如你所看到的,我需要做的事情并不难,但我只需要在很多事情上做到这一点。我发现浏览器正确地垃圾收集了临时浮动,我的内存使用率迅速下降,但前提是浏览器不会首先崩溃


有没有办法让浏览器定期进行垃圾收集(或类似的解决方案),这样我就不会因为大量内存而导致浏览器崩溃?

如果您有可重复的逻辑开关,请动态执行它。。。在真正需要的时候创造所需的价值:

种类:


将这种情况减少两倍内存消耗,只需将第二个缓冲区链接到第一个缓冲区

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);
}
var buffer=[];
var buffer2=缓冲区;
对于(变量i=0;i<10000000;i++){
var num1=thing[i].x*thing;
var num2=thing[i].y*somethingElse;
buffer.push(num1);
缓冲推送(num2);
}

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

您可以尝试在函数范围内的部分执行此操作,但没有尝试此特定情况,但非常确定变量一旦超出范围就会被垃圾收集:

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);
}
功能分配(nFrom,nTo){
对于(变量i=nFrom;i对于(var n=0;我的直觉是,这更多的是关于您保留了多少内存,而不是等待垃圾回收的内存。您正在持久化两个缓冲区,每个缓冲区包含数百万个元素。因此,只要您保留这些缓冲区,您就需要为它们提供内存。我相信垃圾回收器“根据需要”运行,但它无法清除非垃圾。这也是我最初的猜测,但当我分析我的内存时,当浏览器没有崩溃时,几乎所有的内存都是垃圾收集的。对不起,我错了。这与我的数组的大小有关。我可以轻松创建带有浮点数的50mil数组,所以我不确定为什么我不能这样做在我的例子中也是一样。有什么想法吗?“更新第一个缓冲区,同时更新第二个缓冲区”不……您正在更新同一个缓冲区,该缓冲区恰好由两个变量引用。考虑到该示例包含
something
somethingElse
,可以公平地说,这是一个人为的示例。如果他出于某种原因需要两个缓冲区,您的解决方案将无法提供。可能,但请仔细查看,缓冲区和缓冲区2 b即使推了100%相同的东西,在这种情况下,不要忘记,如果你创建了一些其他相等的东西,它们是链接的。我会更新我的示例。@AlexWayne是对的,我确实需要两个缓冲区,而且内容不一样。我想这是最好的选择。函数创建自己的作用域,很容易清理。因此,反复调用函数t只对一点点数据进行操作,应该可以让垃圾收集器工作——这很神奇。这与最终的工作非常接近。我最终能够在多个阵列之间分割东西,但分割工作的想法允许chrome在两者之间进行垃圾收集,因此不会崩溃。感谢这个想法!!
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);
}