我看到网上有人说这样上线时间一长会导致内存爆炸。但是没写改怎么办。那么我们该怎么写呢。
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
会回收,因为mydata type1,type2,type3都是在send函数作用域里的,执行完send函数就被回收了。
只要不是全局变量或闭包,是安全的,手动设置mydata = null是因为用了闭包,需要手动释放引用的原因。
具体的可以看《深入浅出nodejs》的内存回收部分
@Bingmang 谢谢,你帮了我的大忙
@Liaozhenting 不客气
看了zhihu帖子,泼一盆冷水,首先内存释放即GC这个操作是由node内部核心自己来做的,无需人工干预,所以理论上@Bingmang说的没有错,但如果在高并发下,超过单台节点的承受量,会造成GC不及时,爆掉内存,当然这是另外一个问题,只是想提醒一句,node好写,但写健壮还是需要很多后端技能的投入,并不会像前端,一个页面崩掉再打开就是了,后端需要在服务器上跑好久稳定持续提供服务。
@haozxuan 在分页请求的情况下,我觉得内存爆掉的概率比数据库响应下降的概率低多了- -
@haozxuan 小公司的网站,应该不会有太多人访问。并且我用pm2设置超过400M内存就重启服务。不过我会继续努力学习的。
mydata,type123都会在send函数执行完后被回收的。因为只是局部变量。 自豪地采用 CNodeJS ionic
@Liaozhenting 加油,希望你写出更加健壮的后端程序,不要让人感觉node的程序不靠谱,需要定时重启等。
@DevinXian 只是举个栗子,从程序稳定性来讲,一个页面很少打开超过一个月的,而作为服务端稳定一个月不重启更感觉是基本的。至于分页请求可能还涉及到如何有效的做分页,而不是无脑的skip等,只是想表达后端写好并不简单。
nodejs不是可以调用原生扩展吗,你可以自己写个红黑树来管理数据,或用c++实现其他数据结构并手动管理内存。
来自酷炫的 CNodeMD
@zswnew 等以后水平高一一些了可以做一做