在程序运行中,性能优化是必不可少的。从认识内存空间的使用,到垃圾回收的机制,一步步地写出更高效的代码
JS中的内存管理是自动进行的,没有相关API去进行实现,以下内容就可以看做是JS中的内存管理流程
申请空间
//声明变量就可视为申请空间 let obj = {}
使用空间
//对变量的读写操作可视为使用空间 obj.name = "zoe" console.log(obj.name)
释放空间
//把使用不到的变量手动置为空 obj = null
JS中的垃圾回收就是找到垃圾, 让内存引擎去回收这些空间
function objGroup (obj1, obj2) { obj1.next = obj2 obj2.prev = obj1 return { o1: obj1, o2: obj2 } } let obj = objGroup({name:' obj1'}, {name: 'obj2'}) console.log(obj) //此时obj, obj1, obj2都是可达对象,在全局对象上都是可以找到的
function objGroup (obj1, obj2) { obj1.next = obj2 obj2.prev = obj1 return { o1: obj1, o2: obj2 } } let obj = objGroup({name:' obj1'}, {name: 'obj2'}) console.log(obj) //把关于obj1的引用都删除掉,obj1就会被认为是垃圾,从而被JS引擎回收 delete obj.o1 delete obj.o2.prev
为当前对象设置引用数,判断当前对象引用数是否为0,如果为0,就将该对象进行回收,以释放空间和再分配
引用关系改变立即修改引用数字,为0时清除该对象
//user1 user2 user3都被list变量引用 const user1 = { num: 12} const user2 = { num: 23} const user3 = { num: 24} const list = [user1.num, user2.num, user3.num] function fn(){ //fn执行完毕,内部声明的变量num1 num2都会被清除 const num1 = 1 const num2 = 2 } fn()
let obj1 = {name: 'luffy'} let obj2 = {name: 'zoe'} obj1.ref = obj2 obj2.ref = obj1 //此时obj1和obj2互相引用,且没有别的地方再去引用他们,因为他们的引用数都不是0, 就都不会被回收掉
标记整理算法可以看做是标记清除算法的增强版