js内存机制总结

内存大小

  • 和操作系统有关,64位为1.4G,32位为0.7G
  • 64位下新生代的空间为64MB,老生代为1400MB
  • 32位下新生代的空间为16MB,老生代为700MB

js内存回收会暂停整个代码的执行

V8引擎的内存分配

新生代转换为老生代的条件

  1. 新生代内存占用25%以上
  2. 经历过一次回收但仍然存在的变量

区别

算法不同
- 老生代牺牲空间换取时间,会产生磁盘碎片
- 新生代一分为二,把不能回收的变量标记并进行复制

监听内存占用

1. node端 — process.memoryUsage()
2. 浏览器 — window.performance

代码:

function getme() {
    var men = process.memoryUsage();
    var format = function(bytes){
        return (bytes / 1024 /1024).toFixed(2) + 'MB';
    }
    console.log('heapTotal:' + format(men.heapTotal) +
        'heapUsed:' + format(men.heapUsed)
    )
}

var a = [];
var size = 20 * 1024 * 1024;
function b() {
    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)
}
b();
getme();
setInterval(()=>{
    a.push(new Array(size));
    getme();
},1000)

运行结果:


当内存不足时,function b 中的局部变量未被引用,直接回收,直到内存不足报错。

当确认变量不再会被引用,可将变量的值设置为null或undefined来进行释放。

相关引用

1. 大文件上传 (切片上传)
2. node读取大文件,应使用stream,而不是readFile

性能监控方法

  • lighthouse
  • 回报代码
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。