Tag: 垃圾收集

V8是否在一个范围内的单个碎片上进行垃圾回收?

我感兴趣的是V8是否在一个范围内的单个variables的内容上进行垃圾回收,还是只在整个范围内进行垃圾回收? 所以,如果我有这个代码: function run() { "use strict"; var someBigVar = whatever; var cnt = 0; var interval = setInterval(function() { ++cnt; // do some recurring action // interval just keeps going // no reference to someBigVar in here }, 1000); someBigVar = somethingElse; } run(); V8垃圾收集一些someBigVar ? run()的闭包因为setInterval()callback而保持不变,显然cntvariables仍在使用,所以run()的整个范围不能被垃圾收集。 但是,没有实际的持续参考一些someBigVar 。 V8只有垃圾一次收集整个范围吗? 那么, run()的范围不能被垃圾回收,直到间隔停止? 或者是足够聪明的垃圾收集someBigVar因为它可以看到在实际引用someBigVar的区间callback没有代码? 仅供参考,这里有一个关于V8垃圾收集的有趣的概述文章 […]

Node.JS垃圾收集事件? 或者–trace -gc到stderr?

作为一般的做法,当我编写脚本时,日志消息总是进入stderr,数据(状态消息,algorithm的结果等等)转到stdout。 我想把这个发送到stderr。 可以这样做吗? 如果有一个process.on('gc')事件,我可以使用我自己的处理程序。 有一个吗? 我现在正在写一些代码,其中stdout是为数据保留的,我别无select,只能closures–trace-gc。 我使用memoryUsage()作为第二好的东西,但它并没有告诉GC之前和之后的使用情况,它只是告诉你什么时候使用memoryUsage()碰巧被调用。

我应该担心清理Node.js中的大对象还是将其留给垃圾收集器?

最近我遇到了一个node.js API的问题,其中我的内存随着每个请求越来越大。 我正在使用他们的只有512MB内存的免费版本在Heroku上托pipe我的服务器。 在周末获得大量stream量之后,我开始从Heroku中获得超出内存的错误,所以我开始在代码中search内存泄漏,但无济于事。 我没有留下任何东西,一切都应该清理干净,坦率地说,我迷路了。 然而,在做了一些研究后,我发现node.js在达到max-old-space-sizevariables时运行垃圾收集器,并且在64位系统上默认为1024MB。 我把它设置为410(我的可用内存的80%),但不知道我是否应该在代码中处理这个问题? 显然这将是理想的升级我的实例,只是正常的默认上限,但现在不是一个选项。 例: // lets assume there is some apiGet function // that calls back with a very very large object with // the following structure: // { // status: "success", // statusCode: 200, // messages: [], // data: { users: [ huge array of users ] } // […]

for循环中的Javascript内存使用情况

我试图在nodejs(0.10.35)中剖析内存使用情况,我在下面创build了2个文件并使用node –expose-gc var a和var b被初始化为空string 运行for循环使a和b变大 setInterval每1秒打印一次内存使用情况 x >> 20运算符等同于Math.floor(x / 1024/1024),以MB为单位给出结果 //file 1.js var a = '', b = '', n = 0; var i = 10000000; for (;i;i–) {a += i; b += i;}} setInterval(function(){ var m = process.memoryUsage(); console.log(++n,m.rss>>20,m.heapTotal>>20,m.heapUsed>>20); },1000); setTimeout(function(){ global.gc(); console.log('1st garbage collect'); },2500); setTimeout(function(){ a = null; console.log('var a […]

NodeJS:调用global.gc()不会将内存降到最低?

为了研究内存泄漏,我设置了一个在每个POST /gc触发global.gc()的路由 app.post('/gc', function(req, res){ global.gc(); }); 但是,我注意到,如果我发送这个请求,每次都会越来越减less内存使用量。 不应该调用global.gc() 一次就足以把内存global.gc() 最小 ? 如果是这样,为什么每次调用连续多次调用会减less内存 ? (我正在使用Node.js v0.12)

heroku上的node.js web服务器 – 不断增长的内存

我的应用程序启动并运行在5个平行的dynos上的heroku。 有500-1500瑞克/分钟的恒定负载,所以高达25瑞克/秒。 问题是RSS内存在不断增长。 现在我手动重新启动应用程序时,内存达到危险的水平(1 heroku dyno使用的最大内存是512MB)。 内存图表看起来像这样(灰色上限是在512mb限制): 内存释放的时候(在图表上)是当我重新启动应用程序。 奇怪的是,只有当服务器上有不断的负载时才会发生。 当服务器上存在例如2分钟的负载时,则内存增加,之后再下降。 所以看起来由于某种原因,垃圾收集器工作不正常(这是没有收集垃圾,直到服务器加载完成,应用程序不忙)。 有什么我可以做的吗? 这不是内存泄漏,我认为是因为当服务器上没有负载时释放内存… 我到目前为止所尝试的是: 以2分钟间隔手动呼叫GC 设置 – max-old-space-size = 300然而当内存命中300mb时没有任何反应 – 它仍在增加。 也许有其他的select,可以帮助? 节点版本是0.10.20 我使用节点memwatch包,我设法从应用程序收集堆差异: http://jsonfiddle.net/auf8d(11分钟,+37 MB之间的堆差异) http://jsonfiddle.net/4nvcd(15分钟,+50 MB之间的堆差异) 所以肯定会有一些泄漏。 最大的记忆从第一差异变化: … { "what": "Array", "size_bytes": 9320312, "size": "8.89 mb", "+": 79086, "-": 10215 }, … { "what": "Closure", "size_bytes": 2638224, "size": "2.52 mb", "+": […]

Node.js的可扩展性是否因高负载下的垃圾收集而受到影响?

尽pipeNode.js是一个相当热门的话题,但我碰巧发现,由于其垃圾收集模型(http://amix.dk/blog/post/19577),Node.js可能不适合实时应用程序。 。 而且,一些基准testing显示,与RingoJS(http://hns.github.com/2010/09/29/benchmark2.html)相比,Node.js响应速度较慢。 目前,Node.js被绑定到V8 JavaScript引擎,它使用世代停止的GC。 那么,当传入的请求很大时Node.js会被破坏吗? 如果有真实的生产数据,那会更好。 谢谢

为什么v8在这种情况下内存不足?

根据node.js文档,一个节点在32位版本上有一个512meg的限制,在64bit版本上有一个1.4gig的限制。 Chrome AFAICT的限制是相似的。 (+/- 25%) 那么,为什么这个代码在内存使用量不超过424meg的时候会耗尽内存呢? 这里是代码( 代码是无稽之谈,这个问题不是关于代码是做什么的,这是关于代码失败的原因 )。 var lookup = 'superCaliFragilisticExpialidosiousThispartdoesnotrealllymattersd'; function encode (num) { return lookup[num]; } function makeString(uint8) { var output = ''; for (var i = 0, length = uint8.length; i < length; i += 3) { var temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + […]

node.js v8垃圾收集似乎没有触发

我很困惑,因为我的应用程序正在泄漏内存。 这是一个tcp服务器,每分钟处理数十万个数据包。 我已经检查了代码,改进了它并分析了内存。 一切似乎没问题,在低stream量本地testing显示,gc正确释放内存。 但是,如果在stream量大的stream量服务器上,它不会。 所以我尝试使用的expose-gc选项,并添加强制gc到每一个断开连接,现在我发现内存不再泄漏,或者它甚至每一次泄漏? 所以,我的结论是gc没有激活。 我的服务器有3GB的内存,并在几个小时内的应用程序可以吃2.8GB的。 现在强制gc的应用程序不再泄漏。 它维持大约200MB的内存。 所以,我的问题是,为什么gc没有被触发?

node.js native addon – 包装类的析构函数不运行

我正在用C ++编写node.js插件。 我使用node :: ObjectWrap封装了一些类实例,将本地实​​例与一个javascript对象关联起来。 我的问题是,包装的实例的析构函数从不运行。 这里是一个例子: point.cc #include <node.h> #include <v8.h> #include <iostream> using namespace v8; using namespace node; class Point :ObjectWrap { protected: int x; int y; public: Point(int x, int y) :x(x), y(y) { std::cout << "point constructs" << std::endl; } ~Point() { std::cout << "point destructs" << std::endl; } static Handle<Value> […]