繁体   English   中英

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

[英]Memory usage doesn't decrease in node.js? What's going on?

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

因此,当我跟踪内存并打开localhost时,连接两个浏览器窗口,显然会增加一点内存。 我认为它的起始大小为19.3 MB,然后为每个连接添加0.5MB。

然而! 当我关闭连接时,不再打开任何本地主机窗口,它永远不会减少内存使用! 因此,如果它增加到20MB左右,它将停留在那里并且永远不会减少。

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

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

您所看到的是应用程序从系统分配的内存总量。 即使应用程序实际上不需要那么多的内存,使用率通常会上升,然后达到某种稳定水平,而不是下降,这是正常的。

造成这种情况的原因很多,但主要的原因是大多数应用程序(包括node.js)都维护一个堆。 在那堆内存中分配了块和空闲块。 当您请求的内存超过堆所包含的内存时,应用程序就会从系统请求更多的内存并扩大堆。 当这些堆块中的许多块块被释放时,不必立即(或永远)将它们放回操作系统。

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

任何给定的堆管理器都必须决定何时将内存返回给OS效率更高,何时挂起空闲内存以备将来使用更好。 大多数堆管理器都有某种阈值,当堆中超过xx%的内存可用时,它将确定是否可以将任何内存还给操作系统。 但是,即使那样,将内存还给操作系统也不总是容易或可行的,因为堆可能会碎片化,在整个堆中分配了许多较小的堆块,而堆之间有许多空闲块,但实际上并不是连续的大块还给操作系统。

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

从外部看时,唯一真正的查看问题是否存在的方法是让服务器运行数千个请求,并查看内存使用量是否继续增长,甚至超过实际系统内存。是(导致交换)。 如果您看到这种情况,那么您确实会发生某种内存泄漏。

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


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

请参阅对node.js堆快照的一系列命中,以获取有关如何在实际内存使用情况下查看node.js的“内部”的大量讨论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM