讀書筆記:沒有理由去強烈堅持本身選擇的技術就是最好的,而輕視甚至無視其餘技術。若是執拗己見,最終受損的的你本身。若是你願意對技術保持開放的心態,而不是固守本身已經瞭解的技術,聲稱它是最好的,你會發現有更多的機會爲你敞開大門。~~~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