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