内存的生命周期
1.内存调配:申明变量,函数,对象的时候,js会主动调配
2.内存应用:调用的时候
3.内存回收:应用结束,js判断
js垃圾回收
1.援用计数垃圾回收
a对象对b对象有拜访权限,则a援用b对象没有援用对象则标记为垃圾缺点:循环援用:a援用b,b援用a=>内存透露
2.标记革除算法
在运行的时候给存储在内存的所有变量加上标记从根部触发,能涉及的对象,标记革除哪些有标记的视为行将删除的变量
js常见的内存透露
1.全局变量(赋值为null,革除)2.未被革除的定时器和回调(clearTimeout(time))3.闭包 外部函数有权拜访蕴含他的函数的变量4.dom的援用从而,防止内存透露的办法:缩小不必要的全局变量,革除定时器,及时解除援用
sizeof()函数,实现传入object,判断所占内存
const data={ a:111, b:'ccc', 2222:false}/*number:8字节string:每个长度2字节boolean:4字节*/const seen=new WeakSet()function sizeOfObject(object){ if(object===null) return 0 let bytes=0; //对象里的key也占用内存空间 const properties=Object.keys(object) for(let i=0;i<properties.length;i++){ const key=properties[i]; bytes+=calculator(key) if(typeof object[key]==='object' &&object[key]!==null){ if(seen.has(object[key])){ continue } seen.add(object[key]) } bytes+=calculator(object[key]) } return bytes}function calculator(object){ const objectType=typeof object switch(objectType){ case 'string':{ return object.length*2 } case 'boolean':{ return 4 } case 'number':{ return 8 } case 'object':{ if(Array.isArray(object)){ return object.map(item=>calculator(item)).reduce((res,current)=>res+current,0) }else{ return sizeOfObject(object) } } default:{ return 0 } }}console.log(sizeOfObject(data))