当前位置: 首页 > 知识库问答 >
问题:

Node.js流API泄漏

厍华清
2023-03-14

在使用节点流时,我注意到几乎每个教程都教授如下内容:

// Get Google's home page.
require('http').get("http://www.google.com/", function(response) {
  // The callback provides the response readable stream.
  // Then, we open our output text stream.
  var outStream = require('fs').createWriteStream("out.txt");

  // Pipe the input to the output, which writes the file.
  response.pipe(outStream);
});

但在我看来,这是一段相当危险的代码。如果文件流在某个点抛出异常,会发生什么?我认为文件流可能会泄漏内存,因为根据文档,文件流显然没有关闭。

我应该在乎吗?在我看来node.js流应该处理情况...

共有2个答案

拓拔耀
2023-03-14

抛开Node虚拟机中的任何错误,如果有一个异常在流打开后中断操作,我预计最终在垃圾回收机制中,虚拟机会检测到没有任何东西引用流,并收集它,从而处理相关的资源用它。

所以我不会称之为“泄密”。

仍然可能存在与不处理异常或不关闭流相关的问题。例如,在Unix类型的系统上,当创建与磁盘上的文件相对应的流时,将使用文件描述符。一个进程一次可以打开多少个文件描述符是有限制的。因此,如果一个进程没有显式地关闭它的流,它设法留下如此多的未关闭流,以至于在下一个垃圾回收机制之前达到文件描述符限制,它将崩溃。

司空鸿熙
2023-03-14

为了避免文件描述符泄漏,您还需要:

var outStream = require('fs').createWriteStream("out.txt");

// Add this to ensure that the out.txt's file descriptor is closed in case of error.
response.on('error', function(err) {
  outStream.end();
});

// Pipe the input to the output, which writes the file.
response.pipe(outStream);

另一种未记录的方法是outStream。destroy(),这也关闭了描述符,但似乎超出了范围。首选end()

 类似资料:
  • 我正在使用Java制作一个保存和加载文件的应用程序,所以我使用了streams。我从一个文件中获取一个流,然后使用该流在另一个文件夹中创建一个新文件。问题是,在使用流并关闭它之后,本应释放的内存仍然存在。 例如,我加载了一个100mb的文件(任务管理器显示java.exe增加了100mb),然后我将该文件保存在另一个文件夹中,并用stream关闭流。close()。但是java。exe不会减少10

  • 问题内容: 是否有一些工具可以检测Node.js中的内存泄漏?并告诉我您在测试nodejs应用程序方面的经验。 问题答案: 以下工具对于发现内存泄漏很有用: 节点检查器 还有一个教程可以帮助您在此处查找内存泄漏: https://github.com/felixge/node-memory-leak- tutorial

  • Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。 Node.js,Stream 有四种流类型: Readable - 可读操作。 Writable - 可写操作。 Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果。 所有的 Strea

  • 主要内容:什么是 REST?,RESTful Web Services,创建 RESTful什么是 REST? REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。 表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XM

  • 什么是 REST? REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。 表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XM

  • 本文向大家介绍浅析Node.js中的内存泄漏问题,包括了浅析Node.js中的内存泄漏问题的使用技巧和注意事项,需要的朋友参考一下  这篇文章是由Mozilla的Identity团队带来的 A Node.JS Holiday Season系列文章的首篇,该团队上个月发布了 Persona的第一个测试版本。在开发Persona时我们构建了一系列的工具,包括了从调试,到本地化,到依赖管理以及更多的方面