Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js typescript中的节点项目:可用内存_Node.js_Typescript_Memory Management - Fatal编程技术网

Node.js typescript中的节点项目:可用内存

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

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

如果我有一个对象具有多个属性(在我的示例中为2个数组属性),它们占用了大量内存空间,那么在使用完它们之后,如何释放它们。以下是我想到的可能解决方案:

myObj = null

or

myObj = undefined

or

myObj.prop1 = null
myObj.prop2 = null

or

myObj.prop1 = undefined
myObj.prop2 = undefined
所以基本上我想知道:

  • 如果清理对象的每个属性与一次性清理对象相同
  • 如果使用null进行清理与使用undefined进行清理相同,则向垃圾收集器指示可以删除此对象
  • 这是我的tsconfig(如果需要):

    {
      "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或未定义为我以前创建的对象,如果我什么都不做,如果我保持在同一个闭包中,这将仍然存在于内存中,并占用内存空间?是的,您的对象将在内存中,直到最后一次引用它们。在这种情况下,您的所有对象都是在闭包中创建的,并且您没有在其他闭包中传递对它们的引用-当您退出闭包时,它们将从内存中清除。