【问题标题】:Node.js GC mark-compactNode.js GC 标记压缩
【发布时间】:2012-03-30 10:36:45
【问题描述】:

我在使用内存字典(通过 new Constructor(bla, fla, pla) 实例化)的应用程序时遇到问题。 一旦常驻内存大小接近〜100-150 Mbs,标记压缩阶段就会花费一秒钟以上。每百兆增加一秒。

可以通过运行以下命令重现该行为:

node --trace_gc test-memory.js

test_memory.js:

var http      = require('http'),
    Construct = function () {
        this.theField = Math.random();
    },
    storage   = [];

http.createServer(function (req, res) {
    var i = 100000;

    while (--i) {
        storage.push(new Construct());
    }

    res.end('Lots of data generated.');
}).listen(1337, '127.0.0.1');

然后执行 curl localhost:1337 一段时间并观看:

Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 943 ms.
Mark-compact 143.5 -> 143.5 MB, 1306 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 937 ms.
Mark-compact 143.5 -> 143.5 MB, 1189 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 935 ms.
Mark-compact 143.5 -> 143.5 MB, 1191 ms.
Scavenge 143.5 -> 143.5 MB, 1 ms.
Mark-sweep 143.5 -> 143.5 MB, 1015 ms.
Mark-compact 143.5 -> 143.5 MB, 1218 ms.
Scavenge 143.5 -> 143.5 MB, 2 ms.
Mark-sweep 143.5 -> 143.5 MB, 937 ms.
Mark-compact 143.5 -> 143.5 MB, 1195 ms.

据我所知,GC 试图绕过无论如何都不会被释放的对象。

我找到的唯一解决方案是将这些对象移动到缓冲区中,但对于我的应用程序来说,这意味着 JSON.stringify|JSON.parse 的开销很可能最终会占用更多 CPU 时间。另外,这将需要大量重写。

我知道这可能更像是一个 v8 问题,但可能有一些方法可以规避不会被释放的对象的 GC?

node.js 版本为 0.6.11

【问题讨论】:

    标签: javascript node.js garbage-collection


    【解决方案1】:

    您是否尝试过使用 REDIS 或 Membase 比较性能?据我所知,您已经达到了可以将其视为内存数据库的水平,因此您可以尝试与实际使用这些数据库进行比较。

    【讨论】:

    • 我没有,但在我的情况下它不可行。关键是,如果我缓存不可变数据,我可以像这样(即同步)编写我的应用程序:user.item = storage.get('Item', itemId) 使用任何类型的外部存储都会使我使用异步方法。此外,我在我的应用程序中发现了一个漏洞,因此问题得到了一定程度的缓解。
    猜你喜欢
    • 2020-03-25
    • 2016-01-21
    • 2013-03-09
    • 2023-03-15
    • 2015-12-14
    • 1970-01-01
    • 2022-10-04
    • 2015-03-05
    • 2015-08-25
    相关资源
    最近更新 更多