垃圾回收机制
什么是垃圾回收机制 JS中内存的分配和回收都是⾃动完成的,内存在不使⽤的时候会被垃圾回收机制⾃动回收[]
内存的⽣命周期
js环境中分配的内存,有如下⽣命周期:
内存分配 :声明变量,函数,对象的时候,系统会⾃动为他们分配内存
内存使⽤: 既读写内存,使⽤变量 ,函数等 内存回收: 使⽤完毕,由内存回收器 ⾃动回收不再使⽤的内存
说明:
全局变量⼀般不会回收(关闭⻚⾯回收)
⼀般情况下局部变量的值,不⽤了,会被⾃动回收掉 内存泄漏:程序中分配的内存由于某种原因程序未释放或⽆法释放 叫做内存泄漏
有两种实现算法:
引⽤计数法:
引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加 1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0 时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为 0 的值所占用的内存。
标记清除法:
js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。
内存泄漏
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。
Vue 中的内存泄漏问题
如果在mounted/created钩子中使用 JS 绑定了DOM/BOM对象中的事件,需要在 beforeDestroy中做对应解绑处理; 如果在 mounted/created钩子中使用了第三方库初始化,需要在 beforeDestroy中做对应销毁处理(一般用不到,因为很多时候都是直接全局 Vue.use); 如果组件中使用了 setInterval,需要在 beforeDestroy中做对应销毁处理;
js中的内存泄漏
1. 循环引用
2. 闭包
在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。
3. DOM泄露
当原有的COM被移除时,子结点引用没有被移除则无法回收。
4. Timers计(定)时器泄露