node.js中的内存使用量没有减少?发生了什么事?

时间:2015-04-27 01:53:46

标签: javascript node.js server webrtc ram

我使用任务管理器跟踪内存,我的应用程序是使用socket.io的webrtc应用程序。

所以当我跟踪内存并打开localhost时,连接两个浏览器窗口,显然会增加一些内存。我认为它从19.3 MB开始,然后为每个连接增加0.5MB。

无论其!当我关闭连接时,不再打开localhost窗口,它的内存使用量永远不会减少!因此,如果它达到20MB或其他东西,那么它将保持在那里,永远不会减少。

这是为什么?有某种内存泄漏吗?

顺便说一下,这是跟踪内存使用情况的正确方法吗?或者我不应该使用任务管理器?

1 个答案:

答案 0 :(得分:7)

您看到的是您的应用程序从系统分配的内存总量。它是正常的,它可能随着使用而上升,然后达到某种平台,即使应用程序确实不需要那么多内存,也不会再退缩。

这有很多原因,但主要原因是大多数应用程序(包括node.js)都保持堆。在那个内存堆中分配了块和空闲块。当您请求的内存多于堆包含的内存时,应用程序会从系统请求更多内存并增加堆。当释放了许多堆块时,它们不一定立即返回操作系统(或永远)。

这并不意味着应用程序正在泄漏内存,因为如果从堆请求更多内存,那么堆中的那些空闲块将被重用。

任何给定的堆管理器必须决定何时将内存返回到操作系统是有效的,以及什么时候最好挂在空闲内存上以备将来使用。大多数堆管理器都会有某种阈值,当堆中超过xx%的内存空闲时,它会判断它是否可以将任何内存返回给操作系统。但是,即便如此,将内存返回到操作系统并不总是容易或可行的,因为堆可能会碎片化,堆在整个堆中分配大量较小的堆块,中间有大量空闲块,但实际上并不是连续的大块回到操作系统。

此外,许多应用程序使用各种形式的缓存。这些缓存可能都具有某种最大大小,但如果有大量可用的系统内存,这些缓存可能会变得相当大。例如,大多数模板系统可以使用node.js缓存从磁盘解析的模板。当您访问越来越多的页面时,缓存将变得越来越大。

当你从外面看,就像你正在寻找的那样,看看你真的遇到问题的唯一真正方法就是让服务器运行数千个请求,看看内存使用量是否继续增长,甚至超过了真正的系统内存是(导致交换)。如果你发现这种情况发生了,那么你确实会遇到某种内存泄漏。

请记住,在具有高级内存管理器的大型内存系统中,只要存在未使用的系统内存(用于缓存之类的内容),您实际上希望应用程序使用内存来提高性能,因此可以看到它利用免费系统内存是一件好事。您还希望它足够聪明,能够识别它何时耗尽免费系统内存,并可能拨回它用来避免分页到磁盘的内容。

查看node.js实际使用的内存量以及使用它的唯一真实方法是使用各种内存分析工具查看node.js内部的内存使用情况。这可以为您提供堆中内容的完整快照,您甚至可以在堆中的两个时间点之间进行比较,以查看在两个时间点之间分配或释放的内容。根据我使用这些工具的经验,数据量很大,需要一些时间来理解如何读取数据并得出某种有用的结论。很棒的工具 - 只需要一些时间来学习如何使用它。

有关如何查看"内部"的详细讨论,请参阅此set of hits on node.js heap snapshot。 node.js的实际内存使用情况。