[已解决]node没什么不能var obj = {},用obj存数据。
发布于 3 个月前 作者 Liaozhenting 1367 次浏览 最后一次编辑是 7 天前 来自 问答

我看到网上有人说这样上线时间一长会导致内存爆炸。但是没写改怎么办。那么我们该怎么写呢。

router.get("/", (req, res, next) => {
    let send = async () => {
        try {
            let mydata = await myTable.jcwlproducts.findAll({
                attributes: ["type", "pro_name", "pic_url", "detail_url"]
            });
            let type1=[], type2=[], type3 = [],
            mydata.forEach(function (element) {
                if (element.type === 1) {
                    type1.push(element);
                }
                else if (element.type === 2) {
                    type2.push(element);
                }
                else {
                    type3.push(element);
                }
            }, this);
            res.render("product", { type1: type1, type2: type2, type3: type3 });
        }
        catch (e) {
            console.log(e);
            res.send(e);
        }
    }
    send();
});

上面这段代码,mydata,type1,type2,type3都是数组,它们占用的内存会一直存在,不会回收吗? 需要在消息发送之后,手动设置mydata = null吗。 来源:https://www.zhihu.com/question/35401115/answer/62790286?utm_source=wechat_session&utm_medium=social

11 回复

会回收,因为mydata type1,type2,type3都是在send函数作用域里的,执行完send函数就被回收了。

只要不是全局变量或闭包,是安全的,手动设置mydata = null是因为用了闭包,需要手动释放引用的原因。

具体的可以看《深入浅出nodejs》的内存回收部分

@Bingmang 谢谢,你帮了我的大忙

看了zhihu帖子,泼一盆冷水,首先内存释放即GC这个操作是由node内部核心自己来做的,无需人工干预,所以理论上@Bingmang说的没有错,但如果在高并发下,超过单台节点的承受量,会造成GC不及时,爆掉内存,当然这是另外一个问题,只是想提醒一句,node好写,但写健壮还是需要很多后端技能的投入,并不会像前端,一个页面崩掉再打开就是了,后端需要在服务器上跑好久稳定持续提供服务。

@haozxuan 在分页请求的情况下,我觉得内存爆掉的概率比数据库响应下降的概率低多了- -

@haozxuan 小公司的网站,应该不会有太多人访问。并且我用pm2设置超过400M内存就重启服务。不过我会继续努力学习的。

mydata,type123都会在send函数执行完后被回收的。因为只是局部变量。 自豪地采用 CNodeJS ionic

@Liaozhenting 加油,希望你写出更加健壮的后端程序,不要让人感觉node的程序不靠谱,需要定时重启等。

@DevinXian 只是举个栗子,从程序稳定性来讲,一个页面很少打开超过一个月的,而作为服务端稳定一个月不重启更感觉是基本的。至于分页请求可能还涉及到如何有效的做分页,而不是无脑的skip等,只是想表达后端写好并不简单。

nodejs不是可以调用原生扩展吗,你可以自己写个红黑树来管理数据,或用c++实现其他数据结构并手动管理内存。

来自酷炫的 CNodeMD

@zswnew 等以后水平高一一些了可以做一做

回到顶部