阅读 54

学网易云课堂视频课笔记-V8引擎

V8引擎的内存分配学习

  • V8引擎在node和浏览器中,是跑js代码的引擎
  • 底层类-JavaScript异步机制、回收机制、变量机制
  • 源码类-vue,axios,vuex,vue-router
  • 找到某个项目,这个项目你做了什么事情,你在里面是什么角色
    //一些骚操作 同构、APP端适配、移动端解决方案、组件库、架构
    // 一些优化操作,如何管理keep-alive,分模块管理业务,如何去缓存,如何优化路由

js设计之初是为了浏览器

  • 前端的特点-不持久化
  • 执行一遍就全部回收
  • 1.4G完全足够用
  • js回收内存的时候,会暂停执行
  • 回收一次100mb,需要6ms(大概)

新生代内存空间说简单点就是复制 ,from 和 to // 时间复杂度和空间复杂度

node是c++写的,可以扩展C++的内存

局部变量当程序执行结束,且没有引用的时候就会随着消失

全局对象会始终存活到程序执行结束

闭包是ES5的bug,IE5时代的bug。现在的浏览器已解决

function getme(){
  var mem = process.memoryUsage();
  var fotmat function(bytes){
    return (bytes/1024/1014).toFixed(2)+'MB';
  }
  console.log('heapTotal:'+format(mem.heapTotal)+'heapUsed'+format(mem.heapUsed))
}
var size = 20*1024*1024 (20mb)
var arr1 = new Array(size)
复制代码

内存优化的技巧

  • 尽量不要定义全局变量
  • 全局变量记得销毁
  • 用匿名子执行函数变全局为局部
  • 尽量避免闭包-错的。应该是尽量避免闭包的引用
null // 是一个保留字
undefined // 其实是一个变量
复制代码
  • 尽量避免闭包-错的
function a(){
  var size - 20*1024*1024
  var arr1 = new Array(size)
  return arr1
}
// 没有引用,就不会造成内存无法回收
a()
// 引用了就会
var f = a()

复制代码

防止内存泄漏

  • 滥用缓存
  • 大内存操作
import {createReadStream,readFile} from 'fs'

// node 操作文件
// api是一次性读取文件的buffer,内存中,如果是大文件4G,就会出错
fs.readFile()
// 流试读取文件
createReadStream().pipe(write)

// js大文件上传,直接上传一个大文件,浏览器会卡死
// 切片
// file blod slice 二进制
post(file.silce(0,1000))
file.silce(1000,2000)

复制代码