@[toc]java
- V8 js運行的引擎(相似 java運行在jvm上)
- 防止頁面佔用內存過大,引發客戶端卡頓,甚至無響應。
- Node 使用的也是V8,內存對於後端服務的性能相當重要,由於服務的持久性,後端更容易形成內存溢出。
- 面試裝逼神器。
內存的大小和操做系統有關,64位爲1.4G,32位爲0.7G。node
爲何只設置 1.4G ? 而不是2G、3G...c++
- 一、js最初設計是在瀏覽器上跑的,瀏覽器上的js不持久,運行完代碼就能夠了,因此 1.4G 徹底夠用。
- 二、js有垃圾回收機制,回收時會暫停全部代碼的執行,(回收300MB大概須要0.5s),若是設置爲3G,那回收時間會特別長,程序中止時間太久。
新生代:面試
老生代:算法
晉升機制:segmentfault
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) }