我正在用typescript开发一个node项目,因为我对nodeecmascripttypescript生态系统完全陌生,我有一个问题,我无法测试和确认我的想法。
如果我有一个具有多个属性的对象(在我的例子中是2个数组属性),占用了大量的内存空间,一旦我完成了它们,我如何能释放它们。这些都是我脑海中出现的可能的解决方案。
myObj = null
or
myObj = undefined
or
myObj.prop1 = null
myObj.prop2 = null
or
myObj.prop1 = undefined
myObj.prop2 = undefined
所以基本上我想知道:
这是我的tsconfig,如果需要。
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"resolveJsonModule": true
},
"lib": ["es2015"]
}
我使用 node v12.16.3
谅谅
你可以直接删除它们,让垃圾回收来解决。
delete myObj.prop1;
一般来说,如果你有数据需要做一些事情,但不想把它留在内存中,只要获取它并在同一个闭包中使用它,这样当该闭包返回时,所有的东西都会被清理掉。例如
function doSomethingWithBigArray() {
const bigArray = getBigArray();
// do something with it.
}
doSomethingWithBigArray();
这样一来,一旦你做了你需要做的事,闭包就会消失,你就不会有一大块数据在内存里了。
如果我有一个有多个属性的对象(在我的例子中是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中是否有一种方法来表示 "要清理的东西"?没有。