javascript - JavaScript 中的内存管理技术

标签 javascript memory-management garbage-collection

TL;DR -- 从内存管理的 Angular 来看,这两种返回值的方法有什么区别?它们在游戏循环中进行管理,每秒修改数千次。

return { x: x1 + x2, y: y1 + y2, z: z1 + z2 }

// VS

predeclared.x = x1 + x2;
predeclared.y = y1 + x2;
predeclared.z = z1 + x2;

return predeclared;

感谢您的任何见解!

某些上下文...在 webGL/three.js 程序中,在某些情况下,预先声明一个虚拟引用是有益的,该虚拟引用将用于每帧临时保存一个对象,而不是创建一个新对象来协助垃圾收集.我很确定这是一种常见的做法,但以防万一它看起来像这样:

let mesh;

while( true ) {
  mesh = getNewMeshFrame( time );
  renderStuff( mesh );
}

我不确定在如下情况下使用正确的技术。

// With just ONE predeclared object and an object literal in the return statement
function box() {
  let box = { x: 0, y: 0 };

  this.transform = function( addX, addY ) {
    return { x: box.x + addX, y: box.y + addY }; 
  }
}

// OR, with TWO predeclared objects
function box() {
  let box = { x: 0, y: 0 };
  let transformed = { x: 0, y: 0 };

  this.transform = function( addX, addY ) {  
    transformed.x = box.x + addX;
    transformed.y = box.y + addY;    
    return transformed; 
  }
}

我希望很清楚盒子对象是静态的并且不能改变(它是一个复杂得多的对象 IRL),所以我需要将它与其变换分开。谢谢!

最佳答案

每次调用 transform() 时,返回对象字面量的版本都会分配一个新对象。随着时间的推移,这些会在内存中累积,最终需要进行垃圾收集以删除不再使用的那些。

具有预声明变量的版本在每次调用时都会返回对同一对象的引用。所以应该有更少的内存积累,更少的垃圾收集需求。但是,这意味着如果您将多个调用分配给不同的变量,它们都是对同一个对象的引用,该对象正在就地修改。

b = new box();
t1 = b.transform(1, 2);
t2 = b.transform(3, 4);

对于第一个版本,t1t2 是不同的对象:

t1 = {x: 1, y: 2}
t2 = {x: 3, y: 4}

在第二个版本中,它们是同一个对象:

t1 = t2 = {x: 3, y: 4}

如果这不是程序其余部分的问题,那么如果您在同一个盒子上多次调用 transform(),第二个版本应该会显着提高内存效率。

不过,不同盒子之间没有共享。

b1 = new box();
b2 = new box();

在这两个版本中,b1.transform()b2.transform() 之间没有冲突。

关于javascript - JavaScript 中的内存管理技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51390111/

相关文章:

javascript - 无法获取 json 中的 js 数组

javascript - Tippy.js 在 IE 11 中产生不良影响

javascript - 如何计算相对百分比(将分数应用于新范围)?

android - 手机锁定时保持应用程序运行的问题

.NET 线程处于 'pre-emptive GC disabled' 模式,会阻塞 GC 并可能导致死锁

javascript - Easeljs - 触摸事件在平板电脑和 Android 中不起作用 - 但为什么

c# - 在 C# 中获取内存中下一个对象大小的空间

objective-c - iOS设备和iPhone模拟器的内存组织差异

string - 在vb6中清除内存

c# - 您可以在调用 GC.Collect 和 GC.WaitForPendingFinalizers 时出现死锁吗?