当您在Node.js中import
进行文件加载,评估和缓存时。
是否有可能释放该文件的内存,如果您知道以后将不再使用它(或者很长一段时间,值得再次编译它)。
我想做的是导入一个临时文件,读取其代码,执行一次,然后将其永久释放(我知道它不会再被使用了,并且我不想发生内存泄漏)>
基本上在nodejs中有动态代码。
类似于codility的页面,该页面允许您输入代码并在后端执行,应该使用类似的解决方案……除非它们使用该代码运行一个完整的新nodejs实例……然后将其杀死。
有可能吗?如果可以,怎么办?
答案 0 :(得分:1)
您可以像这样从模块缓存中删除。只要确保没有循环依赖项,否则该模块实际上就不会从内存中释放出来
delete require.cache[require.resolve('./theModuleYouWantToDelete.js')]
答案 1 :(得分:1)
这取决于您“释放”模块的含义。一旦运行代码,Nodejs便无法将其删除,因此它将始终保留在内存中。
如果您删除了对模块的所有引用(通过从缓存中删除它)并删除了其他可能对导出数据的引用,那么与该模块关联的任何数据都应符合垃圾回收的条件。
对于允许用户在服务器上运行任意代码的服务,我将始终在沙盒分离的进程中运行该服务,在该进程中您可以杀死该进程并恢复该代码使用的所有资源,而不是在主服务器进程中运行
答案 2 :(得分:0)
好吧,阅读NodeJS documentation about modules时,它恰好存在一个公共cache
成员,并说:
在需要时将模块缓存在此对象中。通过从该对象中删除键值,下一个require将重新加载模块。这不适用于本机加载项,重新加载将导致错误。
也可以添加或替换条目。在本机模块之前检查此缓存,并且如果将与本机模块匹配的名称添加到缓存,则不再需要require调用来接收本机模块。小心使用!
所以我想每个被评估的模块都在内部存在,并像文档中所说的那样从该对象中删除一个密钥,这还将把相关的内存释放给那部分代码(当垃圾收集器开始工作时)