【问题标题】:Memory usage doesn't decrease in node.js? What's going on?node.js 中的内存使用量不会减少吗?这是怎么回事?
【发布时间】:2015-07-05 07:51:37
【问题描述】:

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

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

但是!当我关闭连接时,不再打开本地主机窗口,它永远不会减少内存使用量!因此,如果它上升到 20MB 或其他东西,那么它将保持在那里并且永远不会减少。

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

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

【问题讨论】:

    标签: javascript node.js server webrtc ram


    【解决方案1】:

    您看到的是应用程序从系统分配的内存总量。正常情况下,它可能会随着使用量的增加而上升,然后达到某种平稳状态,即使应用程序并不真正需要那么多内存,也不会回落。

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

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

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

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

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

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


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

    请参阅set of hits on node.js heap snapshot,了解有关如何在实际内存使用情况下查看 node.js 的“内部”的大量讨论。

    【讨论】:

    • 应该提到,如果 OP 想要了解更多信息,那么神奇的短语可能是“垃圾收集”。 (这看起来是一个不错的总结:strongloop.com/strongblog/…
    • 这很有趣。但是,每次我连接一个新连接(使用 localhost 打开更多浏览器窗口并通过 webrtc 连接它们)时,它总是会增加更多内存,并且不会重用任何其他内存。此外,如果这不是一个好方法,那么有什么好方法可以跟踪应用程序使用了多少 RAM?谢谢!
    • @Hellothere - 我添加了更多关于内存使用的讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2014-02-02
    • 2010-09-29
    相关资源
    最近更新 更多