利用谷歌DevTool解决web网页内存泄漏问题

news2024/11/27 2:14:30

目录

web网页内存泄漏

主要的内存泄漏来源

利用谷歌DevTool定位内存泄漏问题

性能Performance

主要功能

Performance insights性能数据分析

Memory内存

三种模式

相关概念

解决内存泄漏问题

第一步 :是否内存泄漏:js堆直增不降;降的不多

第二步:找到导致内存泄漏的函数或者变量,以及出现的时机

第三步:几种常见的内存泄漏。解决:优化代码,手动垃圾回收

总结


web网页内存泄漏

        web 网页内存泄漏指网页在运行过程中,占用的内存越来越多,而无法自动释放,从而导致网页性能下降或崩溃。

主要的内存泄漏来源有:

1. 没有及时清除定时器或回调函数
        如果定时器或回调函数中的变量一直被引用,但没有及时清除定时器,这些变量的内存无法释放,导致内存占用越来越高。

2. 没有及时移除不再需要的事件监听器
        如果一直不停地添加事件监听器但没有及时移除,这也会导致占用的内存越来越高。

3. 闭包
        如果一个闭包的变量一直被引用,其占用的内存也无法释放。

4. DOM 节点引用未清除
        如果持续生成 DOM 节点,但没有及时移除不再需要的节点,DOM 节点会越来越多,占用的内存也会上升。

5. 第三方库或插件未正常释放内存
        一些第三方库或插件如果本身存在内存泄漏,也会影响网页的内存占用。

        初次了解到内存泄漏,还是因为在我的实际项目中网页经常卡顿甚至直接崩溃,占用的cpu和js堆极高。那么我是如何定位到是内存泄漏导致的网页卡顿呢,主要是依靠我们常用的谷歌浏览器自带的devtool工具。

利用谷歌DevTool定位内存泄漏问题

性能Performance

测试网址:https://googlechrome.github.io/devtools-samples/jank/

操作:f12打开谷歌控制台,点开性能Performance工具栏。


主要功能:

1. 模拟移动设备,模拟cpu降速,网络降速

2. 可以使用录制⏺来操作自己的页面生成报告,分析报告中的指标

3. 卡顿主要表现指标:FPS 帧率越低,颜色越红,体验越差。 快捷键:Command+Shift+P (Mac) or Control+Shift+P (Windows, Linux)

4. CPU占用 CPU与摘要中的圆形图表对应

 5. 长任务:右上角有红色三角,需要警惕,长任务耗时异常。

点击长任务可定位到具体哪一行代码导致耗时

6. 提供屏幕截图

Performance insights性能数据分析

使用:控制台右上角更多工具–》Performance insights性能数据分析


        这个工具的作用其实和上一个性能作用是一样的。但是新增了两个面板分别是insight面板和 detail面板

  • ·insight面板:识别和解决潜在的性能问题。并分析用户核心性能指标。直接告诉你哪里有问题

  • ·detail面板:定位代码文件,指出问题,提出解决建议。例如:点击长任务块,会告诉你怎么优化,具体代码位置。

Memory内存

使用:

三种模式

堆快照

控制:支配者视图显示支配者树,可用于查找累积点。这个视图有助于确认没有意外的对象引用仍然存在,并且删除/垃圾收集实际上正在工作。

摘要:“摘要”视图显示按构造函数名称分组的对象。使用它根据构造函数名称分组的类型 搜索对象(及其内存使用)。它对于跟踪 DOM 泄漏尤其有帮助。

统计数据:;

比较:比较两次快照的变化

时间轴上的分配插桩

主要关注:如图蓝色条表示在时间线末尾仍然存在的对象,灰色条表示在时间线末尾分配但后来被垃圾收集的对象

分配采样

查看函数引用tree

相关概念

浅层大小 Shallow size:对象本身持有的内存大小

保留大小 Retained size:定义:在删除对象本身及其从 GC Root中无法访问的依赖对象时释放的内存大小。也就是当前对象自身大小加上对象直接或间接引用的其他对象的大小总和

GC Root:当前时刻存活的对象。https://pic1.zhimg.com/v2-f79a0f0a6d3c485bce3768af596e7b9c_b.webp

距离:使用节点的最短简单路径显示到根的距离。

解决内存泄漏问题

第一步 :是否内存泄漏:js堆直增不降;降的不多

用 Chrome 任务管理器查看你的页面当前使用了多少内存。工具:任务管理器

用性能监视器观察js堆变化,dom节点变化,是否符合升降规律

用内存使用堆快照识别 DOM 树(导致内存泄漏的常见原因)。杀手级别功能。

用内存通过时间轴记录可视化内存使用情况 蓝色条高于分配线需要关注,属于新分配的内容。

第二步:找到导致内存泄漏的函数或者变量,以及出现的时机

去除干扰:多拍几次快照,多对比,

        关注新对象数量和增量两个指标。看一直都保持增量的数据并结合新对象树去分析某个特定操作前后导致内存增加

查找retainer树,定位具体代码位置,数据引用位置

第三步:几种常见的内存泄漏。解决:优化代码,手动垃圾回收

DOM 元素泄漏:在 JavaScript 中,当一个 DOM 元素被移除或者替换时,如果没有正确地清理事件监听器、定时器等资源,那么这些资源就会一直占用内存,从而导致内存泄漏。解决方案是在移除或替换 DOM 元素时,手动清理相关资源。

闭包泄漏:在 JavaScript 中,当一个函数返回另一个函数时,该函数和其变量的作用域就会形成一个闭包。如果这个闭包在外部函数执行完毕后仍然被引用,那么它所占用的内存就会一直存在,从而导致内存泄漏。解决方案是在使用闭包时,尽量避免在闭包内引用外部变量,或者在闭包不再使用时手动将其置为 null

全局变量泄漏:在 JavaScript 中声明全局变量时,全局变量会一直存在于内存中,即使它们在代码执行完毕后已经失去了作用,也不会被自动回收,从而导致内存泄漏。解决方案是在变量不再使用时手动将其置为 null。

总结

        内存泄漏问题的定位和解决不是一下子就能搞定的,特别是问题定位的时候要多利用工具,多比较样本,同时也会花费一定时间去定位到。
        关注内存泄漏的同时,相信您对网页性能提升,问题定位也感兴趣。👏🏻热烈欢迎您使用智子监控系统:基于未来云日志中心和@xes/web-log SDK创建,专为监控前端web应用的性能和错误而设计。当你的线上项目出现异常和错误时❌,智子监控系统可以通过知音楼消息立即通知开发者,第一时间发现问题,并帮助你快速定位与修复,最大限度减少线上损失!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

001Mybatis常用的网站及工具

MyBatis中文网https://mybatis.net.cn/ MyBatis Dynamic SQL – MyBatis Dynamic SQLhttps://mybatis.org/mybatis-dynamic-sql MyBatis GitHubMyBatis has 37 repositories available. Follow their code on GitHub.https://github.com/mybatis/ mybatis-spring-boot-auto…

探究Jetpack(二)之LiveData

目录 LiveData的基本用法比较安全的LiveData使用方法map和switchMapmapswitchMap LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者 LiveData特别适合与ViewModel结合在一起使用,虽然…

大数据Doris(三十七):Spark Load导入HDFS数据

文章目录 Spark Load导入HDFS数据 一、准备HDFS数据 二、创建Doris表 三、创建Spark Load导入任务

C语言编程—常量

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。 常量就像是常规的变量,只不过常量…

云原生系列一:Aeraki --- 管理 Istio 服务网格中任何 7 层协议

导语:Aeraki Mesh 是 CNCF 的沙箱项目,它可以帮助你在服务网格中管理任何七层协议。 今天由叶秋学长来介绍如何通过 Aeraki 来在服务网格中为 Dubbo、Thrift 等协议的服务提供七层流量路由、本地限流、全局限流,以及如何基于 Aeraki Protocol快速开发一个自定义协议,并在 I…

CKA 06_Kubernetes 工作负载与调度 Pod 管理 yaml 资源清单 标签 Pod 生命周期 容器探针

工作负载与调度 1. Pod 管理1.1 kubectl 命令 2. yaml 资源清单2.1 yaml 文件的格式2.2 编写 yaml 资源清单 3. 标签3.1 节点标签选择器 考试题目:pod 中运行 nginx 和 memcache 容器4. Pod 生命周期4.1 Init 容器 5. 容器探针5.1 探测类型5.2 配置存活、就绪和启动…

驱动进化之路:总线设备驱动模型

了解总线设备驱动模型之前,可以先了解常规驱动程序的编写: LED驱动程序框架 驱动设计的思想:面向对象/分层/分离(以LED操作为例) 此次总线设备驱动模型程序的编写基于上述两种框架。 1. 总线设备驱动模型框架 在led_d…

STM32开发——串口通讯(非中断+中断)

目录 1.串口简介 2.非中断接收发送字符 3.中断接收字符 1.串口简介 通过中断的方法接受串口工具发送的字符串,并将其发送回串口工具。 串口发送/接收函数: HAL_UART_Transmit(); 串口发送数据,使用超时管理机制HAL_UART_Receive(); 串口…

虚拟机中Ubuntu不知root密码时设置唯一的非root用户为sudo管理员

刚才在虚拟机中玩Ubuntu的时候,在Cockpit管理页面把账号“服务器管理员”的选项给取消了,然后重新登录之后,就不能执行sudo指令了,所有需要root权限才能访问的文件(目录)、执行的命令全部都不行了。 执行s…

数据传输中的数据转换与处理的常用方法-物联网开发-单片机通信

目录 一、前言 二、实践与代码 1.Unsigned Char 2.memset 3.sprintf 4.atoi 5.atof 6.strcmp 7.strtok 8.strlen 9.strcpy 10.strcat 三、总结 一、前言 本文将以STM32单片机为基础,使用Keil5环境展示以下方法。 在单片机通信、载波通信中,常常涉及数…

【Laravel 6】安装需要什么环境?又怎么安装呢

服务器要求 服务器满足以下要求: PHP > 7.2.5BCMath PHP 拓展Ctype PHP 拓展JSON PHP 拓展Mbstring PHP 拓展OpenSSL PHP 拓展PDO PHP 拓展Tokenizer PHP 拓展XML PHP 拓展 安装Laravel Laravel 使用 Composer 来管理项目依赖。因此,在使用 Larav…

JDK动态代理和cglib代理

文章目录 前言1.JDK动态代理1.1 定义一个接口1.2 实现接口1.3 自定义MyInvocationHandler去实现InvocationHandler接口1.4 测试jdk代理1.5 输出代理类 2.cglib代理2.1 代理接口类2.2 代理普通类2.3 设置属性生成cglib代理类 前言 动态代理在平时的开发中用的也很多&#xff0c…

算法与数据结构(五)

一、c二叉树结构 typedef struct BiNode {int data; //结点内值域struct BiNode* lchild, * rchild; //左孩子 右孩子 } BiNode, * BiTree;或者: class Node { public:char data;// data表示该节点代表的内容;Node* L;//左子树Node* R;//右子树 }; No…

深度学习之卷积神经网络识别图片验证码实战案例(十)

案例背景:程序自动化的爬虫而无需人工介入是我们的最终目标。自动化爬虫避免不了自动登录的问题,在爬取XX数据的过程中,遇到登录图形验证码的识别的问题,那我们该如何攻破这种验证码呢? 字符验证码图片如下&#xff1a…

facenet, dlib人脸识别,人体检测,云数据库mysql,QQ邮箱,手机验证码,语音播报

目录 部分代码展示: 录入部分 识别部分​编辑 活体检测部分​编辑 同步到云数据库MySQL 其他操作 部分图片展示: 完整代码加ui链接: 涉及到的一些知识点的文章 部分代码展示: 录入部分 识别部分 活体检测部分 同步到云数…

峰终定律原理

峰终定律 峰终定律( Peak–End Rule),是由丹尼尔卡尼曼(2002年诺贝尔经济学奖获得者,心理学家)提出的。 模型介绍 峰终定律是指如果在一段体验的高峰和结尾,体验是愉悦的,那么对整个…

走进机器学习

作者简介:本人是一名大二学生,就读于人工智能专业,学习过c,c,java,python,Mysql等编程知识,现在致力于学习人工智能方面的知识,感谢CSDN让我们相遇,我也会致力…

javaScript蓝桥杯---传送门

目录 一、介绍二、准备三、目标四、代码五、知识点六、完成 一、介绍 日常浏览网页的时候,我们会发现一个问题,当页面太长、内容太多的时候我们很难快速浏览到心仪的内容。为了解决这个烦恼,优秀的产品研发团队发明了一种类似传送门的功能&a…

对比分析:黑盒测试 VS 白盒测试

一、引言 在软件开发过程中,测试是确保产品质量的关键环节。其中,黑盒测试和白盒测试是两种常见的测试方法。本文将详细解析这两种测试方法的定义、特点,同时通过具体示例进行对比分析。 二、黑盒测试 黑盒测试,又称功能测试&…

2023最新性能测试面试题合集含答案,看完拿个20Koffer不是问题

1、描述一下你们公司的性能测试流程? 1)分析性能需求(用户使用最频繁的场景进行测试)确定性能指标(例如:事务通过率100%,top99%是5秒,最大并发是2000,CPU和内存都是70%以…