@[toc]java
- V8 js運行的引擎(相似 java運行在jvm上)node
- 防止頁面佔用內存過大,引發客戶端卡頓,甚至無響應。c++
- Node 使用的也是V8,內存對於後端服務的性能相當重要,由於服務的持久性,後端更容易形成內存溢出。面試
- 面試裝逼神器。算法
內存的大小和操做系統有關,64位爲1.4G,32位爲0.7G。後端
- 爲何只設置 1.4G ? 而不是2G、3G...數組
- 一、js最初設計是在瀏覽器上跑的,瀏覽器上的js不持久,運行完代碼就能夠了,因此 1.4G 徹底夠用。瀏覽器
- 二、js有垃圾回收機制,回收時會暫停全部代碼的執行,(回收300MB大概須要0.5s),若是設置爲3G,那回收時間會特別長,程序中止時間太久。markdown
新生代:閉包
老生代:
晉升機制:
eg:
function f () {
var a = ''
}
f(); // f 執行結束 a 就會被回收複製代碼
function f () {
var a = '';
return a;
}
var b = f(); // f 執行結束 a 不會被回收,由於外層做用域還有 a 的引用 b。複製代碼
process.memoryUsage()
window.performance
---
-
a = undefined
-
delete a;
不建議使用,嚴格模式下會出問題
-
(function () {}())
eg:
function getme () {
var mem = process.memoryUsage();
var format = function (bytes) {
return (bytes / 1024 / 1024).toFixed(2) + 'MB';
}
console.log('heapTotal: ' + format(mem.heapTotal) + 'heapUsed: ' + format(mem.heapUsed));
}
var size = 20 * 1024 * 1024;
var arr1 = new Array(size);
var arr2 = new Array(size);
var arr3 = new Array(size);
var arr4 = new Array(size);
var arr5 = new Array(size);
var arr6 = new Array(size);
var arr7 = new Array(size);
var arr8 = new Array(size);
var arr9 = new Array(size);
getme(); // 內存溢出 極限 8 個複製代碼
function getme () {
var mem = process.memoryUsage();
var format = function (bytes) {
return (bytes / 1024 / 1024).toFixed(2) + 'MB';
}
console.log('heapTotal: ' + format(mem.heapTotal) + 'heapUsed: ' + format(mem.heapUsed));
}
var size = 20 * 1024 * 1024;
function a () {
var arr1 = new Array(size);
var arr2 = new Array(size);
var arr3 = new Array(size);
var arr4 = new Array(size);
var arr5 = new Array(size);
var arr6 = new Array(size);
var arr7 = new Array(size);
var arr8 = new Array(size);
}
a();
var arr9 = new Array(size);
getme(); // 內存不會溢出複製代碼
首先重要的是:==閉包並不會影響內存==雖然在某一版(好久遠了)的 《Javascript 權威指南》中做者說過閉包會佔用內存,讓儘可能避免閉包。由於當時 IE5 存在這個 BUG ,因此才致使這個問題。如今的V8是沒有這個問題的,因此這是錯誤的說法。
eg:
function getme () {
var mem = process.memoryUsage();
var format = function (bytes) {
return (bytes / 1024 / 1024).toFixed(2) + 'MB';
}
console.log('heapTotal: ' + format(mem.heapTotal) + 'heapUsed: ' + format(mem.heapUsed));
}
for (let i = 10000; i < 10100; i++) {
setTimeout(function () {
console.log(i);
getme(); // 內存佔用 4.x MB
})
}
// 閉包形式
for (let i = 10000; i < 10100; i++) {
(function (i) {
setTimeout(function () {
console.log(i);
getme(); // 內存佔用 4.x MB
})
})(i)
}複製代碼