1、代码优化
如果代码中使用了大对象作为缓存,会导致老生代的垃圾回收变慢。
const cache = {}
async function getUserInfo(id) {
if (!cache[id]) {
cache[id] = await getUserInfoFromDatabase(id)
}
return cache[id]
}
我们通过缓存用户信息,确实可以达到查询快的效果,但这个cache对象会变得无比巨大,如果不做限制就会有内存泄漏风险。
我们可以使用LRU cache来限制缓存的大小,或者干脆使用redis这样的外部缓存。
const LRU = require('lru-cache');
let cache = new LRU({
max: 50
});
async function getUserInfo(id) {
if (cache.has[id]) {
return cache.get(id);
}
let userinfo = await getUserInfoFromDatabase(id);
cache.set(id,userinfo);
return userinfo;
}
2、内存分配优化
如果新生代空间不足,就会导致频繁GC,从而降低性能。
Node.js 默认给新生代分配的内存是 64MB,但因为新生代 GC实际能使用的内存只有一半即32MB,当业务代码频繁地产生大量的小对象时,这个空间很容易就会被占满,从而触发 GC。虽然新生代的 GC 比老生代要快得多,但频繁的 GC 依然会很大地影响性能。
我们可以修改新生代的内存上限来减少 GC 的次数:
node --max-semi-space-size=128 app.js
当然,新生代也不是越大越好,如果gc次数减少,相应的每次gc时间就会延长,根据经验,一般分配64M~128M就够用了。
3、版本优化
升级新版本的node.js也会相应提升性能。
网友评论