求助:使用Chrome内存分析器排查Vue应用内存泄漏问题
Vue.js应用内存泄漏排查与Heap快照疑问解析
关于PerformanceMeasure的说明
PerformanceMeasure是Chrome内置的性能API对象,用来记录性能指标的时间戳和相关数据。它出现在堆快照里,大概率是你的应用或依赖库调用了performance.mark()或performance.measure(),而且这些实例在标签页关闭时没被正确清理。- 你重复打开关闭标签页10次后内存增长,就是因为每次操作都生成了新的
PerformanceMeasure,但旧的实例没被释放,累积下来占用了内存。
关于compiled code的说明
compiled code是V8引擎把JS代码、Vue模板编译成的字节码/机器码缓存。通常和Vue组件模板编译、动态生成的函数有关。- 如果每次打开标签页都重复编译同一模板,而且编译结果没被缓存,或者缓存的引用没被释放,就会导致这部分内存持续增加。Vue默认会缓存编译后的模板,但如果用了动态模板(比如带复杂
v-if的模板、未预编译的动态组件),就可能出现重复编译的情况。
下一步排查方向
- 先查应用代码和第三方库有没有调用
performance相关API,然后在Vue组件的beforeUnmount/unmounted钩子里,确认有没有清理这些PerformanceMeasure实例。 - 打开Snapshot 7和6的
Retainers视图,追踪PerformanceMeasure的引用链,看是被应用代码、Vue内部还是第三方库拿着没放。 - 检查Vue组件的卸载逻辑:全局事件监听、定时器、Vuex/EventBus的订阅,在组件卸载时必须移除;第三方库的实例(比如图表、编辑器)要调用官方提供的销毁方法。
- 针对
compiled code,开启Vue的模板预编译,避免运行时编译;检查动态创建的组件是否被正确销毁,keep-alive的缓存数量有没有合理控制。
内容的提问来源于stack exchange,提问作者pintaf
相关产品推荐
相关产品推荐

