@[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)
}复制代码