栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

节点Redis发布者占用过多内存

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

节点Redis发布者占用过多内存

这里有两个问题。

为什么程序需要这么多的内存?

我认为这是由于缺乏反压力。

您的脚本仅向Redis发送1M发布命令,但不处理对这些命令的任何答复(因此,它们仅由node_redis丢弃)。因为它从不等待任何答复,所以脚本将为所有这些命令在内存中累积大量上下文。node_redis需要保持上下文以跟踪命令,并关联Redis命令和答复。Node.js排队命令的速度比系统将这些命令传送到Redis,对其进行处理,构建回复并将回复传送回node.js的速度要快。因此,上下文正在增长,它代表了大量的内存。

如果要将内存消耗保持在可接受的水平,则需要降低代码速度,以便有机会让node.js处理Redis答复。例如,以下脚本也处理1M个项目,但它将它们作为1000个项目的批次发布,并等待每1000个项目的答复。因此,它只占用很少的内存(上下文最多包含1000个待处理的命令)。

var redis = require("redis"),    publisher = redis.createClient();function loop( callback ) {   var count = 0;   for ( i=0 ; i < 1000; ++i ) {        publisher.publish("rChat", i, function(err,rep) {        if ( ++count == 1000 ) callback();        });   }}function loop_rec( n, callback ) {    if ( n == 0 ) {        callback();        return;    }    loop( function() {        loop_rec( n-1, callback );    });}function main() {    console.log("Hello");    loop_rec(1000, function() {        console.log("stopped sending messages");        setTimeout(function(){publisher.end();},1000);        return;    });}publisher.ping(main)setTimeout(function() {    console.log("Keeping console alive");}, 1000000);

可以释放内存吗?

通常,它不能。作为所有C / C
++程序,node.js使用内存分配器。释放内存后,它不会释放到系统,而是释放到内存分配器。通常,内存分配器无法将未使用的内存返还给系统。请注意,这不是泄漏,因为如果程序执行新的分配,则内存将被重用。

编写实际上可以向系统释放内存的C / C 程序通常涉及设计自定义内存分配器。很少有C / C

程序可以做到这一点。最重要的是,node.js包括一个带有v8的垃圾收集器,因此它应该对内存释放策略施加其他约束。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号