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)