Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js GC标记压缩_Javascript_Node.js_Garbage Collection - Fatal编程技术网

Javascript Node.js GC标记压缩

Javascript Node.js GC标记压缩,javascript,node.js,garbage-collection,Javascript,Node.js,Garbage Collection,我遇到了一个使用内存字典(通过新构造函数(bla、fla、pla)实例化)的应用程序的问题。 一旦驻留内存大小接近100-150 Mbs,标记压缩阶段就需要一秒钟以上的时间。每一百兆加一秒 通过运行以下命令可以复制该行为: node --trace_gc test-memory.js test_memory.js: var http = require('http'), Construct = function () { this.theField = Mat

我遇到了一个使用内存字典(通过新构造函数(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

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

我没有,但在我的情况下,它将不可行。关键是,如果我缓存不可变数据,我可以这样(即同步地)编写我的应用程序:
user.item=storage.get('item',itemId)
使用任何类型的外部存储将使我使用异步方法。此外,我发现我的应用程序中存在漏洞,因此问题有所缓解。