完整高频题库仓库地址:https://github.com/hzfe/awesome-interview完整高频题库阅读地址:https://febook.hzfe.org/Answerstorelatedquestion垃圾回收机制KeyPointsGarbageCollectionDevTools内存泄漏是指不再使用且未被垃圾回收机制回收的内存。当内存泄漏足够大或足够频繁时,用户会感知到:丝毫都会影响应用程序的性能,表现为缓慢和卡顿;严重时会导致应用程序崩溃,表现为无法正常使用。为了避免内存泄漏带来的不良影响,需要了解垃圾回收机制,掌握内存泄漏分析方法,完善在线相关监控措施。内存泄漏定位和分析一般需要辅助工具,比如ChromeDevTools。开发者可以使用DevTools记录页面活动概览,生成可视化分析结果,从时间轴直观了解内存泄漏;使用DevTools获取多个内存快照,查看内存堆栈变化;并使用Chrome任务管理器实时监控内存使用情况。深入知识点1.排查内存泄漏常见问题在JavaScript中,当一些不再需要的数据仍然可用时,V8会认为这些数据还在使用中,不会释放内存。要调试内存泄漏,我们需要找到错误保留的数据并确保V8能够清理它。当代码量较小时,开发者通常可以根据以下基本原则进行快速自查:是否滥用全局变量,没有手动回收。定时器和闭包是否没有被正确销毁。事件是否没有被正确监控和销毁。此外,开发人员可以使用外部工具来解决内存泄漏问题。2.使用ChromeDevTools定位内存泄露Performance打开需要分析的页面和DevTools的Performance面板,勾选Memory并开始记录,模拟用户操作一段时间后结束记录,DevTools会记录页面行为活动在此期间和分析。通过生成的结果,可以直观的查看内存时间线,了解内存使用量随时间的变化。如果内存使用曲线一直呈阶梯状上升,则可能存在内存泄漏。根据需要在时间线中选择区域碎片,查看相应时间段内的活动类型和时间占用情况,作为排查和定位内存泄漏的辅助手段。Memory打开准备分析的页面和DevTools的Memory面板,按需生成快照。每个快照的内容是在快照时刻垃圾回收后应用程序中所有可访问的对象。当开发者明确知道内存泄漏相关的用户交互步骤后,可以生成多张内存快照进行对比,找出泄漏的对象:在进行用户交互前,对正常的内存栈信息进行快照;在进行用户交互之前内存快照是在操作期间或操作结束时拍摄的。使用比较视图或使用过滤器来查看按需快照之间的差异。上图使用filter检查了snapshot2和snapshot3的区别,从结果可以看出clickCallback闭包是连续分配在两个snapshot之间的。您可以通过单击文件路径来定位内存泄漏代码。3.定位Node.js中的内存泄漏如果你需要定位Node.js中的内存泄漏,启动Node.js时加上--inspect参数,这样你就可以使用ChromeDevTools生成内存快照数据。如图,启动Node.js服务后,打开ChromeDevTools,会有一个Node标志,点击打开Node专用的DevTools。另外,也可以使用第三方包heapdump生成快照文件,导入到ChromeDevTools中的Memory中进行快照对比。使用--expose-gc参数启动Node.js以调用global.gc()方法来触发垃圾收集。使用process.memoryUsage().heapUsed查看内存大小作为内存泄漏的辅助判断。constheapdump=require("heapdump");constcapture=function(){global.gc();heapdump.writeSnapshot("./HZFE_HEAPSNAPSHOT/"+Date.now()+".heapsnapshot");console.log("heapUsed:",process.memoryUsage().heapUsed);};capture();/*可能有内存泄漏的代码片段开始*///code/*可能有内存泄漏的代码片段end*/capture();参考ChromeDevTools修复内存问题
