三行代码,修复 DOM 内存泄露

Docker常用命令汇总(100条) 管理不同的Docker守护进程上下文。- 搜索一个Docker仓库中的镜像。- 显示Docker守护进程的事件。- 显示Docker守护进程的信息。- 启动Docker后台守护进程。- 从一个压缩文件中加载一个镜像。- 登录一个Docker镜像仓库。- 登录到一个Docker仓库。- 查看Docker的系统信息。- 查看Docker的版本信息。- 查看容器中正在运行的进程。- 从一个归档文件中加载镜像。- 将一个镜像打包为归档文件。- 列出所有正在运行的容器。- 导入一个tar包为镜像。 阅读详情

前言

彦祖们,内存泄露应该是前端老生常谈的话题了

但是我们往往停留在理论层面,应付面试官,却十分缺少实战机会

本文是笔者在业务开发中遇到的一次真实案例,以此作为分享

技术栈:vue2(业务限制,未使用 keep-alive)

先看下 vue 官方文档

https://v2.cn.vuejs.org/v2/cookbook/avoiding-memory-leaks.html#%E7%AE%80%E4%BB%8B

场景

业务场景非常简单,就是两个 tab 页面互相切换,但是业务终端不是 pc

而是我们工业互联网业务中的工控机

因为可执行内存只有 1g,所以会经常出现卡顿的情况

彦祖们可以想象成那种医院挂号的终端

场景复现

操作流程

彦祖们,看下我此时的界面(主要关注下 DOM节点)

  1. 查看站点组情况

此时是 846 个

  1. 点击 单设备界面(单机界面)

发现此时的 DOM节点 增加到了 1587 个

当然这是正常现象

多出来的节点个数不就是我这个 单机界面 渲染的节点个数吗?

  1. 回到 站点组界面

惊人的发现 DOM 节点个数飙升到了 2862

  1. 不断来回切换

在笔者来回切换了五六次之后,此时节点个数来到了 5477

排查问题

猜想

我们初步猜想是 单机界面 存在节点内存泄露,那么该如何来证明这个猜想呢?

DevTools 介绍

我们需要借助 chrome devtools 来排查这个问题

  1. 打开 devtools 切到 内存 tab (英文版自行翻译)

2 . 选取 时间轴上的分配插桩

3 . 点击回收垃圾(每次录制前需要手动回收,以保证数据准确)

  1. 在我们的 单机界面 点击开始录制

  1. 点击结束录制,我们能看到时间桩上会分布 蓝色/灰色 的柱状图

柱状图的分布展示了新内存分配时机

蓝色部分表示目前还占用的内存

灰色部分表示目前已被回收的内存

此案例中我们主要关心的是内存分布区域的构造函数

我们检测下有没有 Vue组件泄露

开始录制时间桩

下面我们来模拟下业务中的场景

也就是站点组 单机界面来回切换,生成内存分布图

分析时间桩

  1. 我们利用左右两边的框选工具,定位到第一次切换到单机界面的柱状图

此时我已经切到了 站点组,但是蓝色区域还有大部分没有被回收,让我们来看看是否有单机界面的内存泄露

  1. 过滤出 Vue

一个个检查下,是否有哪个组件只存在单机界面的但是没有被回收

这个 .alter-message 笔者全局搜了一下

并确保只有在 单机界面 使用

前文已经提到,业务中未使用 keep-alive 进行缓存

那么 vue 应该帮我们销毁这个组件了呀

  1. 查看组件详情

我们来深入看下这个组件的信息,发现 vue 的确已经 destroy

这就很奇怪了,难道是所谓的 游离节点(https://juejin.cn/post/6984188410659340324#heading-5)?

不要慌,我们点击组件下面会展示内存分布详情

有些可能无法定位到代码文件,比如这种

这时候笔者就把 26 个泄露的文件一个个检查了一遍…(如果有更好的方式,欢迎评论区留言)

  1. 查看代码

那么我们就进去看看代码,一探究竟,发现以下三处可疑的地方

一步步定位到这两段代码,彦祖们应该已经发现问题所在了

插入一段八股文

此时不禁想起了这段八股文

面试官:造成内存泄露的情况有哪些?

彦祖: 未正确使用闭包 | 事件监听器未移除 | 定时器忘记清理 | 使用插件时,未销毁 | 意外的使用全局变量未回收 | console.log 未清除…

回到正题

没错,我们这里就是命中了三个场景

  1. 事件监听器未移除

  2. 定时器忘记清理

  3. 使用 echarts 时,未销毁

导致堆内存不知道你什么时候会销毁这个事件,这个定时器有没有用它也不知道啊~

这样一来也就长期劫持了对 vue组件 的引用

也就是说每次进入单机界面 都需要开辟新的内存以支持组件的渲染

看下这张图

如果一个界面中某个组件未被完全移除

那么整个界面的所有组件所占用的内存都不能被完全释放

验证猜想

其实以上种种都是我们的猜想

接下来我们加上以下三行代码

  1. 移除全局事件监听
window.removeEventListener('closeException',this.xxx)   
  1. 移除全局定时器
clearInterval(this.timeInterval)   
  1. 销毁 echart 实例
this.myChart.dispose()   

再来抓一下内存分布

会发现已经没有泄露的 vue component 了

并且 DOM 节点 会被回收到 870 不会重复上升

改动3行代码,完美收工,走一个 998 🥳

坑点

彦祖们,补充一个坑点,在调试过程中,最好把 console 全去掉

笔者就在调试过程中遇到了一个坑,发现了这行代码

是的,打印了一下 vue 实例

console.log('实例', this)   

结果导致内存怎么都回收不了

给问题定位带来了重大的干扰

不过这也完美解释了为什么 console.log 为什么会导致内存泄露

总结

总结一下,如果彦祖们怀疑 A 页面有内存泄露,那么测试步骤如下

1.打开内存监视

2.A B A B 来回切换

3.关键!!!最后停留在 B 页面(不然 A 页面渲染了就会导致无法回收),停止内存监视

`黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

Nmap扫描实战命令汇总 Nmap实战详解 阅读详情

相关推荐

docker 常用命令大全

Docker 常用命令大全

胖虎儿的博客 38万+

vmware虚拟机使用教程

以下是我总结的虚拟机的一些经验【不一定正确,仅仅用作参考】 1.vmware选择什么版本比较好,越新的版本越好吗? 并不一定要选择最新的版本。可以选择vmware 12 pro ,这个版本好用。 2.使用教程 点击启动虚拟机 下一步下一步就可以 安装vmtools,安装后就可以...

xijieyuan2qi的博客 17万+

VUE 项目中如何高效检测与修复内存泄露

本文深入探讨了VUE项目中内存泄露的检测与修复方法。内存泄露是导致应用性能下降的常见原因,文章详细介绍了如何使用Chrome DevTools和Vue Devtools进行诊断,并针对事件监听器、定时器、DOM引用及闭包等常见泄露场景提供了精准的修复方案与预防性架构建议,帮助开发者构建更健壮的VUE应用。

weixin_29021291的博客 319

Web安全和渗透测试有什么关系?

做渗透测试的一个环节就是测试web安全,需要明白漏洞产生原理,通过信息收集互联网暴露面,进行漏洞扫描,漏洞利用,必要时进行脚本自编写和手工测试,力求挖出目标存在的漏洞并提出整改建议,当然如果技术再精一些,还要学习内网渗透(工作组和域环境),白盒审计,app,小程序渗透那些了......可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。总之,web安全包含于渗透测试,但不是渗透测试的全部。

Python_0011的博客 4858

React 16.8.6 版本存在内存泄露

发现这个React 内存泄露问题是某一天的晚上一直开着直播页,直播页用的 react 版本是 16.8.6,到了早上跳到这个页面的时候,控制台有点卡,怀疑是有内存泄露,于是就开始分析这个直播页面。 分析 打开控制台 performance 面板点击开始录制,如下: 从上图可以发现在这时间内, nodes 节点一直在增长,很有可能发生了内存泄露。 我们来到 memory 面板分析内存变化: ...

距离的博客 1173

DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目

简单介绍DASH的起源与发展、MPD文件简要解析、相关项目,以及常见流媒体协议的比较

farewellyi的博客 6887

JavaScript中的内存泄露:如何避免及修复

JavaScript是一种强大的编程语言,但在编写代码时,我们经常会遇到内存泄露的问题。本文将介绍JavaScript中可能导致内存泄露的操作,以及如何避免和修复这些问题。

TianXuab的博客 928

从零到一:手把手教你用STM32F103C8T6打造个人专属开发板(附立创EDA工程与源码)

本文详细介绍了如何使用STM32F103C8T6微控制器从零开始设计和制作个人专属开发板。内容涵盖硬件选型、原理图设计、PCB布局、功能验证等全流程,并提供了立创EDA工程文件和源码,帮助开发者深入理解STM32开发板的硬件架构与设计要点。

weixin_26802933的博客 285

4类 JavaScript 内存泄露及如何避免

原文:4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them笔记:涂鸦码龙 译者注:本文并没有逐字逐句的翻译,而是把我认为重要的信息做了翻译。如果您的英文熟练,可以直接阅读原文。 本文将探索常见的客户端 JavaScript 内存泄露,以及如何使用 Chrome 开发工具发现问题。 简介 内存泄...

2502

数电-基于FPGA的自动售货控制系统设计

本次数电的课程设计是设计一款基于FPGA的自动售货控制系统,因为手上暂时没有FPGA的板子,所以先采用proteus仿真进行设计,观察系统效果,等之后FPGA板子下发,再移到quartus上调试和下载。同样是自己第一次自主设计电路系统,可能在功能上不完整或者逻辑上有错误,大家多多包涵,欢迎沟通交流。

gg1067的博客 2293

Vue路由守卫实战:利用token实现跨项目免登录跳转(最新版)

本文详细介绍了如何利用Vue路由守卫和Token验证实现跨项目免登录跳转方案。通过核心架构设计、路由守卫精细化控制及Token交换安全实践,有效解决了多系统跳转中的认证问题,提升用户体验和系统连贯性。

n7o8p的博客 138

JavaScript 内存泄露问题

内存泄露是每个开发者最终都不得不面对的问题。即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况。内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题。 什么是内存泄漏 本质上来讲,内存泄露是当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返还给操作系统或者空闲内存池的现象。编程语言使用不同的方式来管理内存。这些方式可能会减少内存泄露的机会。...

JackLiu16的博客 455

MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战

本文详细解析了在MacOS上使用VScode配置PlatformIO Core时遇到的安装卡死、新建项目缓慢等常见问题,并提供了官方脚本安装、网络优化、命令行预下载等实用解决方案。通过环境变量配置和镜像源加速,大幅提升开发效率,特别适合ESP32等嵌入式开发场景。

weixin_42567046的博客 220

JavaScript中内存泄露的几种情况

在JavaScript开发中,内存泄露是一个常见且可能严重的问题。内存泄露通常发生在程序在不需要某些数据时仍然保留这些数据的引用,导致这些数据无法被垃圾回收机制清除。在长时间运行的Web应用程序或Node.js应用中,内存泄露可能会导致性能下降、应用崩溃或系统资源耗尽。

读心悦 569

图神经网络实战——利用节点回归预测网络流量

在机器学习中,回归指的是对连续值的预测。通常与分类形成鲜明对比,分类的目标是找到正确的类别(即离散值,而非连续值)。在图数据中,分类和回归分别对应于节点分类和节点回归。在本节中,我们将尝试预测每个节点的连续值,而非分类变量。

盼小辉丶的博客 1万+

六种光耦综合对比——《器件手册--光耦》

可控硅输出光耦(SCR Optocoupler)是一种特殊的光电耦合器,由红外发光二极管(LED)和双向可控硅(SCR)组成,用于实现输入和输出之间的电气隔离和信号传输。逻辑输出光耦是一种高效、可靠的数字信号隔离和电平转换器件,通过电气隔离和逻辑电平输出,确保了系统的安全性和信号的稳定性。固态继电器(可控硅输出,SSR)是一种无触点电子开关设备,利用可控硅(SCR或Triac)作为主要开关元件,通过光耦合器实现输入和输出之间的电气隔离。光耦作为一种成熟的电气隔离器件,在电子电路设计中具有重要的地位。

XU157303764的博客 1726

ios 修复 内存泄露_React 16.8.6 版本存在内存泄露

发现这个React 内存泄露问题是某一天的晚上一直开着直播页,直播页用的 react 版本是 16.8.6,到了早上跳到这个页面的时候,控制台有点卡,怀疑是有内存泄露,于是就开始分析这个直播页面。分析打开控制台 performance 面板点击开始录制,如下:从上图可以发现在这时间内, nodes 节点一直在增长,很有可能发生了内存泄露。我们来到 memory 面板分析内存变化: 注:上图的蓝色...

weixin_39801356的博客 210

Win10或Win11电脑找不到以太网网络适配器的解决方法

Win10或Win11电脑找不到以太网网络适配器的解决方法

Robot_PLC_HMI_Automation 655

一个Vue页面的内存泄露分析

什么是内存泄露?内存泄露是指new了一块内存,但无法被释放或者被垃圾回收。new了一个对象之后,它申请占用了一块堆内存,当把这个对象指针置为null时或者离开作用域导致被销毁,那么这块内存没有人引用它了在JS里面就会被自动垃圾回收。但是如果这个对象指针没有被置为null,且代码里面没办法再获取到这个对象指针了,就会导致无法释放掉它指向的内存,也就是说发生了内存泄露。为什么代码里面会拿不到这个对象指...

杰克拉乌的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JavaScript内存泄露的4种方式及如何避免

简介 内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题。 什么是内存泄露? 本质上,内存泄露可以定义为:应用程序不再需要占用内存的时候,由于某些原因,内存没有被操作系统或可用内存池回收。编程语言管理内存的方式各不相 同。只有开发者最清楚哪些内存不需要了,操作系统可以回收。一些编程语言提供了语言特性,可以帮助开发者做此类事情。另一些则寄希望于...

ruanhongbiao的专栏 4万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【前端】内存泄露及解决方案

【前端】内存泄露及解决方案

前端小菜鸟也有人起的博客 2018

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: Linux系统问题及处理方法(网络问题)
下一篇: 看漫画学网络安全(非常详细)零基础入门到精通,收藏这一篇就够了
网络安全大白
博客等级 码龄5年 7305粉丝 698原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值