js内存泄露

news2024/11/18 22:37:17

文章目录

  • 定义
  • 引起内存泄漏的操作:
    • Chrome 控制台查看内存情况
      • 无痕模式
      • Performance
      • Memotry
        • 1. 先用 Allocation instrumentation on timeline 确认问题
        • 2. 再用 Head snapshot 定位代码
    • 闭包函数使用不当

js内存泄露如何检测?场景有哪些?如何定位到具体代码?

定义

程序中已动态分配的堆内存由于某种原因程序未释放或无法释放引发的各种问题,如浏览器变慢,奔溃,延迟大

引起内存泄漏的操作:

  1. 闭包函数使用不当
  2. 未使用的 var 声明的全局变量
  3. 循环引用
  4. 控制台日志(console.log)

Chrome 控制台查看内存情况

无痕模式

打开Chrome的无痕模式,这样做的目的是为了屏蔽掉Chrome插件对我们之后测试内存占用情况的影响

Performance

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在页面从零到加载完成这个过程中JS Heap(js堆内存)、documents(文档)、Nodes(DOM节点)、Listeners(监听器)、GPU memory(GPU内存)的最低值、最高值以及随时间的走势曲线

Memotry

作用:用于记录页面堆内存的具体情况以及js堆内存随加载时间线动态的分配情况
在这里插入图片描述

1. 先用 Allocation instrumentation on timeline 确认问题

在这里插入图片描述

在开始记录后,我们可以看到图中右上角有起伏的蓝色与灰色的柱形图,其中蓝色表示当前时间线下占用着的内存;灰色表示之前占用的内存空间已被清除释放

2. 再用 Head snapshot 定位代码

闭包函数使用不当

// 其中,arr被赋值给 res,arr 被标记为活动变量并一直占用着相应的内存,假如 res 后续用不到,这内存就一直占用 
<button onclick="btnClick()">点击</button>
<script>
    function test() {
        let arr = new Array(1000000);// 一个很大的数组对象
        function fn() {
            let c = [1, 2, 3]
        }
        fn()
        return arr
    }
    let res = []
    function btnClick() {
        res.push(test())
    }
</script>
  1. 先使用 performacne 的曲线图
    在这里插入图片描述
    在这里插入图片描述

在每次录制开始时手动触发一次垃圾回收机制,这是为了确认一个初始的堆内存基准线,便于后面的对比,然后我们点击了几次按钮,即往全局数组变量res中添加了几个比较大的数组对象,最后再触发一次垃圾回收,发现录制结果的JS Heap曲线刚开始成阶梯式上升的,最后的曲线的高度比基准线要高,说明可能是存在内存泄漏的问题

  1. 用 Allocation instrumentation on timeline 手机动态内存分配情况
    在这里插入图片描述

动态内存分配情况图上都会出现一个蓝色的柱形,并且在我们触发垃圾回收后,蓝色柱形都没变成灰色柱形,即之前分配的内存并未被清除,确认内存泄漏的问题是存在的

  1. 用 Head snapshot 定位
    在这里插入图片描述
    在这里插入图片描述

所以选择Object allocated between Snapshot1 and Snapshot2即展示第一条快照和第二条快照存在差异的内存对象分配情况,Array的百分比很高,初步可以判断是该变量存在问题

避免策略:

  1. 减少不必要的全局变量
  2. 避免"死循环"
  3. 避免创建过多的对象
  4. 减少层级过多的引用

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

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

相关文章

2023年财务管理案例研究与应用(圆桌)论坛在京举办

2023年5月13日&#xff0c;由中国企业财务管理协会、机械工业信息研究院与用友网络科技股份有限公司共同策划的 2023 财务管理案例研究与应用 (圆桌) 论坛在用友产业园成功举办。 国务院国资委财务监管与运行评价局局长李冰&#xff0c;中国企业财务管理协会副会长&#xff08;…

macOS 安装NVM

一、卸载已经安装的node 我用命令brew uninstall node16 发现报错 后面我用where node 发现当时安装node并没有用brew工具安装 于是运用删除文件的方式卸载node sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}二、brew 安装nu…

MySQL—日志

文章目录 一、错误日志二、二进制日志2.1 介绍2.2 格式2.3 查看2.4 删除 三、查询日志四、慢查询日志 一、错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据…

铿锵玫瑰 别样绽放

-----衢州首支飞盘女队成立 5月15日在一个火热既温馨的下午&#xff0c;在衢州市衢江区社会组织服务中心“馨满益足”女工服务站里。首批优秀女性代表集聚一堂举行了衢州铿锵玫瑰飞盘女队沙龙。至此衢州首支飞盘女队正式落地&#xff0c;这支队伍将在今后参加各类女子飞盘比赛…

DevEco Studio 3.1 Release | 动态共享包开发,编译更快,包更小

原文&#xff1a;DevEco Studio 3.1 Release | 动态共享包开发&#xff0c;编译更快&#xff0c;包更小&#xff0c;点击链接查看更多技术内容。 动态共享包&#xff08;HSP&#xff09;开发是DevEco Studio 3.1 Release版本带来的新特性&#xff0c;基于新的编译方式&#xff…

gpt接口新增配额控制

工作内容,不对外开放 场景: 用户使用gpt时会消耗token,我们要求能够在某个地方配置gpt限额,gpt限额有全局限额也有个人配置的限额, 先配置一个默认的全局的限额(所有用户gpt3.5每个月不能超过1000,每天不能超过500,每个小时不能超过100), 用户可以配置用户的限额(该…

RoyalScope-总线工作状况和信号质量“体检”

海量存储、洞悉细微 无间断连续采样、波形和报文记录 内置100MHz示波器&#xff0c;采样率高达100MS/s&#xff0c;精确查看、分析和统计信号波形细节。 无间断连续采样总线上信号&#xff0c;全部无遗漏的解析成报文(包括数据帧、遥控帧、过载帧、错误帧、帧间隔和错误报文)和…

matlab绘制任意位置方位的圆锥

1.前记&#xff1a; 使用surf函数实现指定顶点&#xff0c;圆锥半径&#xff0c;高度的圆锥。 2.代码 为了实现任意位置和方位&#xff0c;使用机器人系统工具箱函数getTransform计算机器人末端正运动的齐次矩阵结果并将其位置和方位赋予要画的圆锥体上。 运行函数&#xff1…

springboot+java博物馆文物管理系统

用户前台进入系统可以进行首页、文物信息、论坛交流、文物资讯、留言反馈、我的、跳转到后台等springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最…

bug:nodepad++安装hex Editor插件闪退

bug&#xff1a;nodepad安装hex Editor插件闪退 解决办法&#xff1a; 查看是否是自己的hex Editor版本下载错了&#xff08;x86对应x86、x64对应x64&#xff09;如果nodepad版本是v7.6.4&#xff0c;则需要安装0.9.9的hex Editor 0.9.9 winx64版本&#xff1a;https://github.…

一年换 3 份工作,在家躺平半年了!

见字如面&#xff0c;我是军哥&#xff01; 还记得&#xff0c;我之前写的这篇《三年换 3 份工作&#xff0c;再也找不到工作了&#xff01;》文章&#xff1f;上周有一位读者在这篇文章下留言&#xff0c;说自己去年一年换了 3 份工作&#xff0c;目前在家躺了半年了&#xff…

ML | 4.朴素贝叶斯

基于概率论的分类方法&#xff1a;朴素贝叶斯 文章目录 基于概率论的分类方法&#xff1a;朴素贝叶斯概述条件概率贝叶斯公式 朴素贝叶斯分类器2个假设Example:文本分类欢迎关注公众号【三戒纪元】 概述 朴素贝叶斯可以处理多类别问题&#xff0c;在数据较少的情况下仍然有效&…

加速度传感器的量程估算

在测震动和噪声的场合&#xff0c;现有的加速度传感器&#xff0c;需要客户提供加速度值的大致区间。这个值该怎么计算呢&#xff1f;它几乎完全与被测信号的频率有关。因为所有的信号&#xff0c;按照频域展开的视角&#xff0c;都会简化为一个个正弦波。对于正弦波有这样的属…

亚马逊云科技新增功能:在一个位置设置您的亚马逊云科技通知

5月5日&#xff0c;亚马逊云科技发布AWS User Notifications&#xff0c;这是在亚马逊云科技管理控制台中设置和查看多个亚马逊云科技账户、区域和服务的亚马逊云科技通知的单一位置。 可以以一致、人性化的格式集中设置和查看来自100多项亚马逊云科技服务的通知&#xff0c;…

什么是语音识别的智能客服?

前言 随着人工智能技术的不断发展&#xff0c;语音识别技术越来越成熟&#xff0c;语音技术的应用也越来越广泛。智能客服是其中一个应用领域&#xff0c;它通过语音识别技术&#xff0c;将用户的语音输入转换为文本&#xff0c;并通过自然语言处理技术&#xff0c;解决用户的…

数据库的恢复技术

更好的阅读体验 存储器结构 分类 1、易失性存储器&#xff1a;内存、高速缓冲存储器 2、非易失性存储器&#xff1a;磁盘、磁带 3、稳定存储器&#xff1a;理想的存储器&#xff0c;其中信息永不丢失 稳定存储器的实现 要实现稳定存储器&#xff0c;就要在多个非易失性存储…

32从零开始学Java之方法传参到底是值传递还是引用传递?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家讲解了方法的定义、调用和返回值&#xff0c;但方法的内容还有…

如何避免在Facebook群组中过度营销?

在社交媒体时代&#xff0c;Facebook群组已经成为了企业宣传的热门渠道之一。然而&#xff0c;很多企业在使用Facebook群组进行宣传时&#xff0c;都会犯一个很容易被忽视的错误——过度营销。 过度营销不仅会让Facebook群组的成员感到反感&#xff0c;甚至还会让管理员将你的帖…

如何进行TCP抓包调试?

网络调试工具——Wireshark Wireshark 是世界上应用最广泛的网络协议分析器&#xff0c;它让我们在微观层面上看到整个网络正在发生的事情。 Wireshark 本身是一个开源项目&#xff0c;所以也得到了很多志愿者的支持。同时&#xff0c;Wireshark 具有丰富的功能集&#xff0c;…

基于短时傅里叶变换的同步压缩变换原理和Matlab代码

基于短时傅里叶变换的同步压缩变换原理 新的短时傅里叶变换(STFT)被定义为 考虑一个单分量信号 对相位 φ ( t ) \varphi (t) φ(t)进行泰勒展开&#xff0c;并丢弃二阶以及高阶项。 将上式带入STFT后&#xff0c;可得 关于上式对时间 t t t求导&#xff0c;得到关于瞬时频…