是否可以在nodejs中释放所需的模块?

时间:2019-09-20 19:34:26

标签: node.js

当您在Node.js中import进行文件加载,评估和缓存时。

是否有可能释放该文件的内存,如果您知道以后将不再使用它(或者很长一段时间,值得再次编译它)。

我想做的是导入一个临时文件,读取其代码,执行一次,然后将其永久释放(我知道它不会再被使用了,并且我不想发生内存泄漏)

基本上在nodejs中有动态代码。

类似于codility的页面,该页面允许您输入代码并在后端执行,应该使用类似的解决方案……除非它们使用该代码运行一个完整的新nodejs实例……然后将其杀死。

有可能吗?如果可以,怎么办?

3 个答案:

答案 0 :(得分:1)

您可以像这样从模块缓存中删除。只要确保没有循环依赖项,否则该模块实际上就不会从内存中释放出来

delete require.cache[require.resolve('./theModuleYouWantToDelete.js')]

答案 1 :(得分:1)

这取决于您“释放”模块的含义。一旦运行代码,Nodejs便无法将其删除,因此它将始终保留在内存中。

如果您删除了对模块的所有引用(通过从缓存中删除它)并删除了其他可能对导出数据的引用,那么与该模块关联的任何数据都应符合垃圾回收的条件。

对于允许用户在服务器上运行任意代码的服务,我将始终在沙盒分离的进程中运行该服务,在该进程中您可以杀死该进程并恢复该代码使用的所有资源,而不是在主服务器进程中运行

答案 2 :(得分:0)

好吧,阅读NodeJS documentation about modules时,它恰好存在一个公共cache成员,并说:

  

在需要时将模块缓存在此对象中。通过从该对象中删除键值,下一个require将重新加载模块。这不适用于本机加载项,重新加载将导致错误。

     

也可以添加或替换条目。在本机模块之前检查此缓存,并且如果将与本机模块匹配的名称添加到缓存,则不再需要require调用来接收本机模块。小心使用!

所以我想每个被评估的模块都在内部存在,并像文档中所说的那样从该对象中删除一个密钥,这还将把相关的内存释放给那部分代码(当垃圾收集器开始工作时)