美文网首页程序员
V8引擎如何回收内存

V8引擎如何回收内存

作者: 眸晓 | 来源:发表于2020-07-22 14:44 被阅读0次
  1. 内存主要就是储存变量等数据的
  2. 局部变量当程序执行结束,且没有引用的时候就会随着消失(但是!!局部变量在方法调用完之后,可以被回收,但不是用完就立刻回收
  3. JS什么时候回收内存?a.内存不够的时候 b.定时回收
  4. 全局对象会始终存活到程序运行结束。

运行如下的例子,你会明白一些V8的内存回收机制

// 获取内存的使用情况,并打印
function getMemory(){
  var mem = process.memoryUsage();
  var format = function(bytes){
    return (bytes/1024/1024).toFixed(2) + 'MB';
  }
  //heapTotal 和 heapUsed 代表 V8 的内存使用情况
  console.log('heapTotal: ',format(mem.heapTotal)+'  heapUsed: ',format(mem.heapUsed));
}

// 模拟创建大内存数据并执行
var num = 1024*1024*20;
function init(){
  var arr1 = new Array(num);
  var arr2 = new Array(num);
  var arr3 = new Array(num);
  var arr4 = new Array(num);
  var arr5 = new Array(num);
}
init();

for(let i=0;i<13;i++){
  //多次重复创建大内存数据,打印内存消耗情况
  let arr = new Array(num)
  getMemory()
}

node环境打印出来结果:

heapTotal:  834.57MB  heapUsed:  801.55MB
heapTotal:  994.57MB  heapUsed:  961.88MB
heapTotal:  1154.57MB  heapUsed:  1121.84MB
heapTotal:  1314.58MB  heapUsed:  1281.87MB
heapTotal:  1474.58MB  heapUsed:  1441.84MB
heapTotal:  1634.59MB  heapUsed:  1601.87MB
heapTotal:  1794.59MB  heapUsed:  1761.84MB
heapTotal:  1954.59MB  heapUsed:  1921.87MB  //注意这里,即将达到2G内存消耗
heapTotal:  834.57MB  heapUsed:  801.75MB    //这里之前回收了一次内存
heapTotal:  994.57MB  heapUsed:  961.78MB
heapTotal:  1154.57MB  heapUsed:  1121.75MB
heapTotal:  1314.58MB  heapUsed:  1281.78MB
heapTotal:  1474.58MB  heapUsed:  1441.75MB

你会发现,当heapTotal接近2G时,V8引擎回收了一次内存(即init函数中的局部变量),所以可以得出结论:局部变量在方法调用完之后,可以被回收,但不是用完就立刻回收,当内存不够的时候,会回收掉无用的变量。

内存优化技巧:

  1. 尽量不要定义全局变量
  2. 全局变量记得销毁掉(不用的时候设置为undefined)
  3. 用匿名自执行函数变全局为局部
  4. 尽量避免闭包——但这个结论是错的,因为不是闭包就一定会造成内存溢出!!!
  5. 尽量避免闭包引用——如果变量引用了闭包返回的值,就要注意内存的溢出 ↓
function getData(){
    let size = 20*1024*1024;
    var arr = new Array(size);
    return arr;
}

var a = getData();
var b = getData();
var c = getData();
var d = getData();
var e = getData();
  1. 不要滥用V8的缓存(全局变量,不是浏览器缓存),如果有大缓存,可以加锁缓存(先进先出,老的缓存释放掉,再进入新缓存)
  2. 注意大内存量操作(用流的方式读取,分片处理)

闭包:不是一种固定写法,而是一种思想:变量只允许在内部,只可以以我指定的方式让外部访问,并不是完全暴露给外部,这就是闭包的形式。

相关文章

  • V8 内存管理和垃圾回收机制总结

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识。 V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,No...

  • V8 GC机制

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识。 V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,No...

  • v8引擎的垃圾回收

    v8引擎的垃圾回收机制 如何查看node内存使用情况? v8的内存分类 堆内存 // 对象、字符串、闭包新生代内存...

  • 优化你的内存

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识。(总结来自网易课堂) V8引擎内存回收机制 为什么我们要关注内存...

  • 2019-05-30

    1. V8内存管理和相关问题 Node.js基于V8引擎,其内存管理就是V8的内存管理。 V8内置了自动垃圾回收(...

  • javaScript 性能优化(学习笔记)

    内容概要 内存管理 垃圾回收和常见的GC算法 V8引擎的垃圾回收 Performance 工具 代码优化实例 内存...

  • 如何避免内存泄漏 - 2023-02-18

    V8引擎的内存限制 虽然V8引擎帮助我们实现了自动的垃圾回收管理,解放了我们勤劳的双手,但V8引擎中的内存使用也并...

  • 常见GC算法与V8引擎

    内存管理 垃圾回收与常见GC算法 V8引擎的垃圾回收 Performance工具 代码优化实例 内存管理 为什么要...

  • js语言性能优化以及相关概念理解

    概要 内存管理 垃圾回收与常见的 GC 算法 V8 引擎的垃圾回收 performance 工具 代码优化示例 内...

  • v8垃圾回收 - 2023-02-18

    V8引擎垃圾回收策略: V8的垃圾回收策略主要是基于分代式垃圾回收机制,其根据对象的存活时间将内存的垃圾回收进行不...

网友评论

    本文标题:V8引擎如何回收内存

    本文链接:https://www.haomeiwen.com/subject/luazkktx.html