node项目在typescript中:释放内存

问题描述 投票:0回答:1

我正在用typescript开发一个node项目,因为我对nodeecmascripttypescript生态系统完全陌生,我有一个问题,我无法测试和确认我的想法。

如果我有一个具有多个属性的对象(在我的例子中是2个数组属性),占用了大量的内存空间,一旦我完成了它们,我如何能释放它们。这些都是我脑海中出现的可能的解决方案。

myObj = null

or

myObj = undefined

or

myObj.prop1 = null
myObj.prop2 = null

or

myObj.prop1 = undefined
myObj.prop2 = undefined

所以基本上我想知道:

  1. 清理对象的每个属性是否和一次性清理对象一样?
  2. 如果使用null进行清理,就等于使用undefined进行清理,向垃圾收集器表明这个对象可以被删除。

这是我的tsconfig,如果需要。

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "resolveJsonModule": true
  },
  "lib": ["es2015"]
}

我使用 node v12.16.3

谅谅

node.js typescript memory-management
1个回答
2
投票

你可以直接删除它们,让垃圾回收来解决。

delete myObj.prop1;

一般来说,如果你有数据需要做一些事情,但不想把它留在内存中,只要获取它并在同一个闭包中使用它,这样当该闭包返回时,所有的东西都会被清理掉。例如

function doSomethingWithBigArray() {
  const bigArray = getBigArray();
  // do something with it.
}
doSomethingWithBigArray();

这样一来,一旦你做了你需要做的事,闭包就会消失,你就不会有一大块数据在内存里了。


0
投票

如果我有一个有多个属性的对象(在我的例子中是2个数组属性),这些属性占用了大量的内存空间,一旦我做完这些属性,我如何释放它们。

你不需要自己清理。JavaScript引擎有一个 清洁工 为你做的。例如,V8有一个垃圾收集器,名为 奥里诺科. 由于,Node.js在引擎盖下使用了JavaScript引擎V8,这意味着应用了垃圾收集器Orinoco。

此外,使用 delete 操作符可能会损害你的性能(或者不,这取决于你的场景和JavaScript引擎)。

所以,我可以建议你不要使用 delete 运营商或试图清理后自己。只要像你想的那样使用所有的东西,在大多数情况下,垃圾收集器会做任何其他事情。

function doSomethingWithMyObject() {
  myObj.prop1 = ['a', 'huge', 'array', 'here']
  myObj.prop2 = ['a', 'huge', 'array', 'here'];

  // doing some heavy stuff here with them

  // function is done and you return something useful
  return usefulData;
}

// myObj will be cleared after that, or, at least, marked for cleaning by GC

UPD:在JavaScript中帮助GC清理内存有意义吗?

在我看来,没有意义。Orinoco使用Mark &Sweep技术(虽然,经过了强烈的优化和修改),并跟踪所有指向对方的东西。

你唯一能做的就是帮助GC清理内存--避免对对象的悬空引用。一旦JavaScript对象失去了对它的所有可访问引用,GC就会清理它。

UPD2: 是否 delete 操作员有助于清理内存?

不,你可以在 MDN:

与一般人认为的不同,删除操作符与直接释放内存无关。内存管理是通过中断引用间接完成的。

在JavaScript中是否有一种方法来表示 "要清理的东西"?没有。

© www.soinside.com 2019 - 2024. All rights reserved.