读书笔记:没有理由去强烈坚持本身选择的技术就是最好的,而轻视甚至无视其余技术。若是执拗己见,最终受损的的你本身。若是你愿意对技术保持开放的心态,而不是固守本身已经了解的技术,声称它是最好的,你会发现有更多的机会为你敞开大门。~~~node
node 对内存泄漏十分的敏感,有成千上万的流量下,一个字节的泄漏都会形成堆积,在垃圾回收时,扫描对象时耗时更多,影响整个应用的响应时间,知道进程内存溢出,应用崩溃。数据库
形成内存溢出的因素:数组
缓存(谨将内存当缓存)缓存
为了解决缓存中对象没法释放的问题,须要加入一种策略来限制缓存的无限增加bash
var LimitableMap = function (limit) {
this.limit = limit || 10; //限制相应的大小
this.map = {};
this.keys = [];
};
var hasOwnProperty = Object.prototype.hasOwnProperty;
LimitableMap.prototype.set = function (key, value) {
var map = this.map;
var keys = this.keys;
if (!hasOwnProperty.call(map, key)) {
if (keys.length === this.limit) {
var firstKey = keys.shift(); //当超过大小时,就作出队列处理
delete map[firstKey];
}
keys.push(key);
}
map[key] = value;
};
LimitableMap.prototype.get = function (key) {
return this.map[key];
};
module.exports = LimitableMap;
复制代码
模块的引入,为了加速模块的引入,全部的模块都会进行编译执行,缓存起来,由exports导出的函数,能够访问文件模块中的私有变量,这样子文件模块编译执行生成的做用域由于模块的缓存而不会被释放。因为模块的缓存机制,模块是常驻老生代的。(要十分当心内存泄漏)dom
var leakArray = [];
exports.leak = function () {
leakArray.push("leak" + Math.random());
};
<!--每次外部调用leak时, leakArray 会一直增长,不停的占用内存,且不被释放。-->
复制代码
若模块不可避免的要使用上面的设计,那么就添加一个清空队列的接口。异步
直接将内存做为缓存要十分谨慎,一不当心就会有不少的问题函数
关注队列的状态性能
在解决了缓存带来的内存泄漏后,另外一个不经意会产生内存泄漏的就是队列ui