node.js中的内存使用量没有减少?这是怎么回事?

Hel*_*ere 1 javascript ram node.js webrtc server

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

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

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

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

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

jfr*_*d00 8

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

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

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

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

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

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

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


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

请参阅node.js堆快照上的组命中,以获取有关如何在实际内存使用情况下查看node.js"内部"的大量讨论.