Node.js typescript中的节点项目:可用内存
我正在用typescript开发一个节点项目,因为我对node/ecmascript/typescript生态系统完全陌生,我有一个问题,我无法测试和确认我的想法: 如果我有一个对象具有多个属性(在我的示例中为2个数组属性),它们占用了大量内存空间,那么在使用完它们之后,如何释放它们。以下是我想到的可能解决方案:Node.js typescript中的节点项目:可用内存,node.js,typescript,memory-management,Node.js,Typescript,Memory Management,我正在用typescript开发一个节点项目,因为我对node/ecmascript/typescript生态系统完全陌生,我有一个问题,我无法测试和确认我的想法: 如果我有一个对象具有多个属性(在我的示例中为2个数组属性),它们占用了大量内存空间,那么在使用完它们之后,如何释放它们。以下是我想到的可能解决方案: myObj = null or myObj = undefined or myObj.prop1 = null myObj.prop2 = null or myObj.pr
myObj = null
or
myObj = undefined
or
myObj.prop1 = null
myObj.prop2 = null
or
myObj.prop1 = undefined
myObj.prop2 = undefined
所以基本上我想知道:
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"resolveJsonModule": true
},
"lib": ["es2015"]
}
我正在使用节点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:帮助GC清除JavaScript中的内存有意义吗?
在我看来,事实并非如此。Orinoco使用标记和扫描技术(尽管经过了强烈的优化和修改),并跟踪彼此指向的所有内容
帮助GC清理内存的唯一方法是避免挂起对对象的引用。一旦JavaScript对象丢失了对它的所有可访问引用,GC将清除它
UPD2:delete
操作员是否帮助清理内存?
没有。您可以在以下网站上阅读更多信息:
与一般的看法不同,delete操作符与直接释放内存无关。内存管理是通过中断引用间接完成的
有没有一种方法可以在JavaScript中表示“需要清理的内容”?不。谢谢你的回答,所以对于你的第一个解决方案,我将始终需要迭代每个属性,我不能一次清理整个对象?阅读这个问题,我认为OP很清楚Node有GC以及GC通常是如何工作的-他不是问如何像C中那样释放内存,他问的是如何正确地向GC指示它应该被清除。这样做没有意义(指示某些东西可以被清除)。我将更新答案。首先,在某些情况下,这可能是有意义的。但最重要的是,OP不是在问这是否是一个好的做法,他是在问他如何才能做到这一点。即使这是一种不好的做法,从教育的角度来看,找出如何做这种不好的做法仍然是有价值的。感谢您的回答,但即使您更新了答案:如果我没有将任何引用设置为null或未定义为我以前创建的对象,如果我什么都不做,如果我保持在同一个闭包中,这将仍然存在于内存中,并占用内存空间?是的,您的对象将在内存中,直到最后一次引用它们。在这种情况下,您的所有对象都是在闭包中创建的,并且您没有在其他闭包中传递对它们的引用-当您退出闭包时,它们将从内存中清除。