国外 精美 网站,做电商哪个设计网站比较好,南城县建设局网站,前端网页特效内存泄漏 在执行一个长期运行的应用程序时#xff0c;应用程序分配的内存没有被释放#xff0c;导致可用内存逐渐减少#xff0c;最终可能导致浏览器崩溃或者应用性能严重下降的情况#xff0c;即 JS 内存泄漏
可能导致内存泄漏的场景
不断创建全局变量未及时清理的闭包应用程序分配的内存没有被释放导致可用内存逐渐减少最终可能导致浏览器崩溃或者应用性能严重下降的情况即 JS 内存泄漏
可能导致内存泄漏的场景
不断创建全局变量未及时清理的闭包如果闭包中引用了外部的变量而这个变量又没有被及时释放就可能发生内存泄漏。DOM元素的引用如果一个DOM元素被保存在一个JavaScript变量中但是页面上该DOM元素被移除这个变量仍然引用着这个DOM元素导致它无法被垃圾回收。事件监听器如果一个DOM元素添加了事件监听器但在移除该元素之前没有移除事件监听器则可能发生内存泄漏。循环引用两个对象相互引用导致它们不能被垃圾回收。现代浏览器改用标记清除的垃圾回收机制已解决了此问题
vue 中内存泄漏的场景
组件销毁时未清除全局变量的引用、函数引用、全局事件、自定义事件、定时器。
// 全局变量引用vue实例上的响应式变量
window.list this.list
// 全局变量引用vue实例上的函数
window.copy this.copy如何避免内存泄漏
避免创建全局变量。使用严格模式或者let/const声明变量。及时解除DOM元素的引用。在移除DOM元素之前移除相关的事件监听器。使用弱引用或者引用计数来处理循环引用的问题。如使用 WeakMap 和WeakSet使用工具或者浏览器自带的开发者工具检测和分析内存使用情况找出潜在的内存泄漏。编写单元测试以确保内存的正确释放。使用try/catch/finally来确保资源在异常发生时也能被正确释放。定期进行垃圾回收例如在JavaScript中可以使用window.gc()来强制进行垃圾回收但这不是标准方法并且不建议在生产环境中使用。
检测 JS 内存泄漏的方法
可使用浏览器自带的开发者工具 上图中HEAP值随时间一直上升即发生了内存泄漏
正常的内存应该如下图每隔一段时间就会进行垃圾回收下降 垃圾回收 GC GC 是垃圾回收Garbage Collection的缩写是由 JavaScript 引擎自动执行的自动内存管理机制用于检测和清除不再使用的数据以释放内存空间。
垃圾回收的目的是减少内存泄漏和提高程序的性能。
JS 垃圾回收的算法
引用计数之前
通过跟踪每个对象被引用的次数来确定对象是否为垃圾。
逻辑
当一个对象被创建时其引用计数器初始化为1。当该对象被其他对象引用时引用计数器加1。当该对象不再被其他对象引用时引用计数器减1。当引用计数器减至0时意味着该对象不再被引用可以被垃圾收集器回收。
// 创建一个对象
let obj { name: test };
// 创建一个引用指向对象
let ref1 obj;//引用计数1 1
// 创建另一个引用指向对象
let ref2 obj;//引用计数1 2
// 引用失效
ref1 null;//引用计数-1 1
ref2 null;//引用计数-1 0
// 引用计数为0对象可以被回收优点
实时回收在对象不再被引用时立即回收不需要等待垃圾收集器的运行。这可以减少内存占用和提高程序的性能。简单高效实现起来相对容易不需要复杂的算法和数据结构。
缺点
两个或多个对象相互引用时无法被回收导致内存泄漏引用计数需要占用额外的内存空间而且每次添加、删除引用都需要更新计数增加了额外的开销。
标记清除现代
通过标记不再使用的对象然后清除这些对象的内存空间以便后续的内存分配使用。
逻辑
在标记阶段垃圾回收器会对内存中的所有对象进行遍历从根对象开始通常是全局对象递归地遍历对象的引用关系。对于每个被访问到的对象垃圾回收器会给它打上标记表示该对象是可达的即不是垃圾。在清除阶段垃圾回收器会遍历整个内存对于没有标记的对象即被判定为垃圾的对象会被立即回收释放内存空间。
优点
简单有效算法相对简单容易实现可清除循环引用
缺点
会暂停程序的执行进行垃圾回收操作。当堆中对象较多时可能会导致明显的停顿影响用户体验。会在回收过程中产生大量的不连续的、碎片化的内存空间。这可能导致后续的内存分配难以找到足够大的连续内存块从而使得内存的利用率降低。
标记整理优化
在标记清除的基础上增加了整理
逻辑
在标记阶段标记活动对象在整理阶段将内存中的活动对象移动到一端使得空闲空间连续并且没有碎片化。在清除阶段清除垃圾回收内存
优点
解决了标记-清除算法产生的碎片化问题使得内存空间得到更好的利用减少了空间的浪费。
缺点
会暂停程序的执行进行垃圾回收操作。当堆中对象较多时可能会导致明显的停顿影响用户体验。
V8 引擎的垃圾回收策略
V8是一种由Google开发的用于执行JavaScript 的开源引擎用于浏览器和Node.js
分代式垃圾回收
将内存划分为新生代Young Generation和老生代Old Generation两个代
新生代存放的是存活时间较短的对象经过一次垃圾回收后,就被释放回收掉采用了基于Scavenge算法的快速垃圾回收策略通过将内存分为两个半空间来进行垃圾回收优化了对象的分配和回收过程。老生代存放的是存活时间较长的对象经过多次垃圾回收后仍存在采用了基于标记-整理-清除算法的全垃圾回收策略通过对整个堆进行标记和整理以减少内存的碎片化提高内存利用率。
更多详情可参考 https://zhuanlan.zhihu.com/p/689678104