内存使用不会减less在node.js? 这是怎么回事?

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

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

然而! 当我closures连接,所以没有更多的本地主机窗口打开,它永远不会减less内存使用量! 所以如果它达到20MB或者什么的话,它会停留在那里,永远不会减less。

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

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

你所看到的是应用程序从系统分配的内存总量。 这是正常的,它可能会使用,然后达到某种高原,而不是回落,即使应用程序不需要太多的内存。

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

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

任何给定的堆pipe理器必须决定何时将内存返回给操作系统是有效的,以及何时挂起到可用内存以备将来使用。 大多数堆pipe理者会有一些门槛,当堆中超过xx%的内存空闲的时候,会判断是否可以将任何内存送回操作系统。 但是,即使如此,将内存还给操作系统并不总是那么容易或者不可行,因为堆可以被分割成许多遍布整个堆的较小的堆块,其间具有大量的空闲块,但不是实际上可能是连续的大块回到操作系统。

另外,许多应用程序使用各种forms的caching。 这些caching可能都具有某种最大尺寸,但是如果有大量可用的系统内存,这些caching可能会变得相当大。 例如,大多数模板系统可以使用node.js从磁盘cachingparsing的模板。 随着您访问越来越多的页面,caching将越来越大。

从外部看,你正在寻找,唯一真正的方法来看看你是否真的有问题是让服务器运行成千上万的请求,看看是否内存使用量继续增长,甚至超出了真正的系统内存是(导致交换)。 如果你看到这种情况发生,那么你真的有一些内存泄漏。

请记住,在具有高级内存pipe理器的大型内存系统中,只要存在未使用的系统内存(对于像caching这样的内存),您实际上就想要一个应用程序来使用内存来提高性能,所以看到它利用了免费的系统内存一件好事。 您还希望它足够聪明,可以识别何时闲置的系统内存不足,并可能回拨它用来避免分页到磁盘。


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

在node.js heap snapshot上查看这组点击了大量关于如何在实际内存使用情况下查看node.js“内部”的讨论。