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

这篇具有很好参考价值的文章主要介绍了利用谷歌DevTool解决web网页内存泄漏问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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降速,网络降速

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

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

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

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

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

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

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

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

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

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

6. 提供屏幕截图

Performance insights性能数据分析

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

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


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

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

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

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

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

Memory内存

使用:

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

三种模式

堆快照

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

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

统计数据:;

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

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

时间轴上的分配插桩

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

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

分配采样

查看函数引用tree

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

相关概念

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

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

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

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

解决内存泄漏问题

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

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

到了这里,关于利用谷歌DevTool解决web网页内存泄漏问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux:进程等待究竟是什么?如何解决子进程僵尸所带来的内存泄漏问题?

     进程等待通常是指: 父进程通过wait()/waitpid()的方式,让父进程对子进程进行资源回收的等待过程!!  进程等待通常是为了解决以下两种情况: 解决子进程僵尸所带来的内存泄漏问题,对僵尸子进程进行资源回收! 原因在于当子进程僵尸后,便“刀枪不入”了。即使是

    2024年04月16日
    浏览(36)
  • 解决谷歌浏览器右键翻译为简体中文(无法翻译此网页的问题)

    申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址 全文共计2385字,阅读大概需要3分钟 欢迎关注我的个人公众号:不懂开发的程序猿 2022年9月末,谷歌翻译关闭了中国大陆地区的服务,如果继续访问https://translate.google.cn/会直接重定向到https://translate.google

    2024年02月06日
    浏览(36)
  • 【Android】多线程编程、异步消息处理机制以及new Handler()被标记为过时的解决办法,解决Handler内存泄漏问题和AsyncTask的基本用法

    1.1 弱引用 WeakReference (弱引用)是一种在Java中用于管理对象的引用的特殊引用类型。它的作用是在垃圾回收过程中,允许对象在没有强引用指向它时被回收( 当一个对象只有弱引用指向它,而没有强引用指向它时,垃圾回收器可能会在下一次垃圾回收时回收该对象,即使系

    2024年02月04日
    浏览(35)
  • Django用RSA实现Web登录加密传输,预防抓包泄漏密码,解决ModelForm无法实现传输加密问题

    问题:         在使用Django学习制作网站时候,以为后端钩子处理使用了md5加密,数据库中也同样以md5的方式存储,这样就解决了密码泄漏问题,因为对前端没有足够的了解所以枉下次定论。         在测试爬取自己的网站时候发现,登录页面控制台能抓包看见密码明

    2024年02月01日
    浏览(66)
  • 内存泄漏问题

            内存泄漏是一种常见的问题,它可能导致系统内存不断增加,最终耗尽可用内存。解决内存泄漏问题通常需要进行调试和分析。下面是一些可能有助于解决内存泄漏问题的步骤: 1. 监控内存使用情况: a. 使用 malloc 记录日志: 在内存分配的地方添加记录,以便跟

    2024年01月17日
    浏览(30)
  • ThreadLocal有内存泄漏问题吗

    对于ThreadLocal的原理不了解或者连Java中的引用类型都不了解的可以看一下我的之前的一篇文章Java中的引用和ThreadLocal_鱼跃鹰飞的博客-CSDN博客 我这里也简单总结一下: 1. 每个Thread里都存储着一个成员变量,ThreadLocalMap 2. ThreadLocal本身不存储数据,像是一个工具类,基于ThreadL

    2024年02月14日
    浏览(34)
  • C++ map clear内存泄漏问题

    map自带的clear()函数会清空map里存储的所有内容,但如果map值存储的是指针,则里面的值不会被清空,会造成内存泄漏,所以值为指针的map必须用迭代器清空。 使用erase迭代删除 迭代器删除值为指针的map,一定要注意迭代器使用正确,一旦迭代器失效程序就会崩溃。 调用cle

    2024年02月09日
    浏览(27)
  • iOS解决内存泄漏工具

    在iOS应用中,有一些工具和技术可以帮助识别和解决内存泄漏问题。以下是一些常用的工具,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.Instruments: Instruments 是Xcode中的性能分析工具,其中包含了用于检测内存泄漏的工具

    2024年01月18日
    浏览(31)
  • 解决鸿蒙APP的内存泄漏

    解决鸿蒙(HarmonyOS)应用的内存泄漏问题需要采用一系列的策略和技术。与解决Android内存泄漏类似,以下是一些建议,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.使用鸿蒙开发者工具: 鸿蒙提供了开发者工具,其中包括

    2024年02月01日
    浏览(26)
  • [JAVA]websocket引起的内存泄漏问题排查

    项目运行一天后出现了 java.lang.OutOfMemoryError: GC overhead limit exceeded 的错误,造成系统宕机。这说明给JVM分配的内存已经耗尽,不足以支撑垃圾回收进行内存回收工作,意味着程序占用的内存随着时间大小提升,最终耗尽。 2.1 宏观分析 从字面意思来看,GC(garbage collection)所需

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包