内存泄露与解决

什么是内存泄漏

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在

哪些操作会造成内存泄漏?

1、垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的
引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的
内存即可回收
2、setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
3、闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

JS 内存泄漏的解决方式(必会) 

1、global variables:对未声明的变量的引用在全局对象内创建一个新变量。在浏览器中,全
局对象就是 window。
function foo(arg) {
bar = 'some text'; // 等同于 window.bar = 'some text';
}

1.1)解决:

1.1.1)创建意外的全局变量
function foo() {
this.var1 = 'potential accident'
}
1.1.2)可以在 JavaScript 文件开头添加 “use strict”,使用严格模式。这样在严格模式
下解析 JavaScript 可以防止意外的全局变量
1.1.3)在使用完之后,对其赋值为 null 或者重新分配
1.2)被忘记的 Timers 或者 callbacks
在 JavaScript 中使用 setInterval 非常常见
大多数库都会提供观察者或者其它工具来处理回调函数,在他们自己的实例变为不可达时,
会让回调函数也变为不可达的。对于 setInterval,下面这样的代码是非常常见的:
var serverData = loadData();
setInterval(function() {
var renderer = document.getElementById('renderer');
if(renderer) {
renderer.innerHTML = JSON.stringify(serverData);
}, 5000); //This will be executed every ~5 seconds.
这个例子阐述着 timers 可能发生的情况:计时器会引用不再需要的节点或数据
1.3)闭包:一个可以访问外部(封闭)函数变量的内部函数
JavaScript 开发的一个关键方面就是闭包:一个可以访问外部(封闭)函数变量的内部函数。
由于 JavaScript 运行时的实现细节,可以通过以下方式泄漏内存:
var theThing = null;
var replaceThing = function () {
var originalThing = theThing;
var unused = function () {
if (originalThing) // a reference to 'originalThing'
console.log("hi");
};
theThing = {
longStr: new Array(1000000).join('*'),
someMethod: function () {
console.log("message");
}
};
};
setInterval(replaceThing, 1000);
1.4)DOM 引用
有时候,在数据结构中存储 DOM 结构是有用的。假设要快速更新表中的几行内容。将每行 DOM
的引用存储在字典或数组中可能是有意义的。当这种情况发生时,就会保留同一 DOM 元素的两份引
用:一个在 DOM 树种,另一个在字典中。如果将来某个时候你决定要删除这些行,则需要让两个引
用都不可达。
var elements = {
button: document.getElementById('button'),
image: document.getElementById('image')
};
function doStuff() {
elements.image.src = 'http://example.com/image_name.png';
}
function removeImage() {
// The image is a direct child of the body element.
document.body.removeChild(document.getElementById('image'));
// At this point, we still have a reference to #button in the
//global elements object. In other words, the button element is
//still in memory and cannot be collected by the GC.
}

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

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

相关文章

通过串口中断的方式进行ASR-01S模块与STM32通信(问题与解决)

前言: 最近在做一个智能家居的项目,需要实现语音控制的功能,于是我选用了ASR-01S模块与STM32通信,这个模块最大的好处在于有配套的编程软件和语音库,不用自己训练且编程简单(少儿编程的程度)。…

LEETCODE LCS 03. 主题空间

题目描述如上,这个题主要运用了DFS的思想,同时走过的路径标记为6,即可在后续的遍历中过滤掉重复的元素,其他则类似边界条件的判断和题目条件的判断,求最大值,只需要一次遍历中累加对比每一次得即可。 模板&…

数据结构与算法-树-二分搜索树(一)

二分搜索树 今天我们尝试构建一颗二分搜索树,很多同学只有理论,并没有对树有其编码实践。通过一步步的实现一颗二分搜索树,加深对数据结构树的理解。 二分搜索树,又名二分排序树,有人也叫它二分查找树。 特点 二分搜索…

最强AI换脸工具Rope使用教程,Rope整合包下载【全网最全安装步骤】

Rope的汉化整合包(包含模型)以及下面教程所涉及到的所有安装包我都打包好了,需要的小伙伴可以关注文章底部公众号,回复关键词【rope】获取。 AI换脸软件简介必读 Rope 是一个免费开源的 AI 换脸软件,它具有图形化界面…

Centos启用rc-local服务

Centos启用rc-local服务 简介问题分析解决方法启动并查看状态 简介 大多时候我们可以在/etc/rc.d/rc.local中写一些命令来实现随着服务器的启动(重启)运行自己的程序或服务,但是配置后无法启动,查看了下rc-local.service服务状态显示未启动。 [rootmas…

[ROS 系列学习教程] rosbag Python API

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

如何创建用户流(User Flow):分步指南

原文作者:Camren Browne,CareerFoundry 翻译:数字营销工兵 (sources: 图片来源于网络) 用户流(User Flow)是当今用户体验行业中最有用但被误解的工具之一。资深设计师经常避开它们,而初级设计师则很难抓住它们。 事…

炸裂!全球首个AI程序员!

近年来,人工智能(AI)在多个领域取得了显著进展,不断拓展其能力边界。一个引人注目的突破是全球首个AI程序员——Devin的诞生。 这一创新不仅展示了AI技术的快速进步,而且对软件开发领域和未来的工作场景产生了深远的影…

关于ffmpeg height not divisible by 2的错误

在我们线上视频生产过程中,我们用ffmpeg对视频做了resize,讲原有的分辨率resize到1280p,使用了参数 -vf "scale1280:-1",作用是将原始视频宽度缩放成1280,-1是指高度等比例缩放。 之前一直运行的好好的&…

网络基础知识-操作系统作用+进程管理-嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 本章的主要内容见下图: 本章知识和计算机…

Twitter代运营服务商哪家好?CloudNEO为您提供全链解决方案

在当今社交媒体盛行的时代,Twitter作为全球最知名的社交平台之一,已成为企业推广品牌、吸引客户和增加曝光的重要渠道。然而,如何有效地利用Twitter进行品牌推广和营销,成为许多企业面临的挑战。在这个背景下,选择一家…

ES6:可迭代对象(Iterable object)

一、概念 可迭代对象是数组的泛化,是定义了内置迭代器方法 Symbol.iterator 的对象。是可以在for..of 循环中使用的对象。 二、迭代器(iterator) 为了让对象可以迭代,我们需要给对象添加一个迭代器--Symbol.iterator。 迭代器…

HarmonyOS(鸿蒙)不再适合JS语言开发

ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者可以以更简洁、…

OpenvSwitch VXLAN 隧道实验

OpenvSwitch VXLAN 隧道实验 最近在了解 openstack 网络,下面基于ubuntu虚拟机安装OpenvSwitch,测试vxlan的基本配置。 节点信息: 主机名IP地址OS网卡node1192.168.95.11Ubuntu 22.04ens33node2192.168.95.12Ubuntu 22.04ens33 网卡信息&…

通过键盘对机械臂进行操作

1 #include<myhead.h>2 #include<linux/input.h>3 #define SER_PORT 88884 #define SER_IP "192.168.116.225"5 #define CLI_PORT 99996 #define CLI_IP "192.168.65.129"7 int main(int argc, const char *argv[])8 {9 //1、创建用于连接…

28.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据推测结果用提示框的形式显示

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;27.数据推测功能…

Pytorch NLP入门3:用嵌入表示单词

初次编辑时间&#xff1a;2024/3/17&#xff1b;最后编辑时间&#xff1a;2024/3/17 本栏目链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12597850.html 本人的其他栏目&#xff1a; pytorch 基础的栏目链接&#xff1a;https://blog.csdn.net/qq_33345365/…

便利店小程序有哪些功能

​便利店小程序为附近的住户提供小程序在线购物的服务。用户只需要打开小程序&#xff0c;就可以购买需要的商品&#xff0c;可以选择自取或者配送。整个过程非常简单快速。下面具体介绍便利店小程序的功能。 1. **商品展示**&#xff1a;展示便利店的商品信息&#xff0c;包括…

快速幂算法详解

一、引言 快速幂算法是数学和计算机科学中用于大数幂运算的一种高效算法。它采用了二进制分治策略&#xff0c;将幂运算分解为更小的部分&#xff0c;从而显著降低运算的时间和空间复杂度。在处理大规模数幂运算、加密算法和某些数学问题时&#xff0c;快速幂算法显示出其卓越…

贪心算法题解

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这篇文章将给大家介绍贪心算法和贪心算法题目的练习和解析&#xff0c;贪心算法的本质就是每一个阶段都是局部最优&#xff0c;从而实现全局最优。我们在做题的同时&#xff0c;不仅要把题目做出来&#xff0c;还要有严格的证…