什么是javascript内存泄漏?以及解决方法
什么是javascript内存泄漏?以及解决方法
- 一、什么是javascript内存泄漏?
- 二、常见的内存泄漏
- 1.意外的全局变量(通常是变量未被定义或者胡乱引用了全局变量)
- 2.计时器
- 3.闭包
- 4.事件监听未被移除
- 5.console.log
- 6.缓存
一、什么是javascript内存泄漏?
内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
简单理解:无用的内存还在占用,得不到释放和归还,比较严重的时候,无用的内存还会增加,从而导致整个系统卡顿,甚至崩溃
二、常见的内存泄漏
1.意外的全局变量(通常是变量未被定义或者胡乱引用了全局变量)
例如:
这里我们给函数中一个未声明的变量b赋值,这时就会使b成为一个全局变量
function a(){b=10;
}
a()
console.log(window);
这里的window打印出来就是
这样就会创建一个多余的全局变量,当执行完a函数之后,变量b仍然会存在于全局对象中,这就会造成内存泄漏
解决方法:
我们可以通过使用严格模式“use strict”来避免这一切。在JavaScript文件的开头,它将开启更严格的JavaScript解析模式,从而防止意外的创建全局变量,开启严格模式之后,程序就会报错b没有定义
注意:
需要特别注意那些用于临时存储和处理大量信息的全局变量。如果必须使用全局变量存储数据,就使用全局变量存储数据,但在不再使用时,就手动将其设置为
null,或者在处理完后重新分配。否则的话,请尽可能的使用局部变量。
2.计时器
例如:
setInterval("内存泄漏 ", 1000);
1.setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
2.启动循环定时器后不清理
var intervalId = setInterval(function () {console.log( '内存泄漏')
}, 1000)
它会一直循环下去
解决方法:
使用cLearInterval清理计时器
const intervalId = setInterval(function () {console.log('内存泄漏')
}, 1000)
clearInterval(intervalId)
3.闭包
例如:
在fn1创建的内部函数fn2是不会回收的,因为它被全局变量f引用, 处于一个随时被调用的状态,所以会造成内存泄漏
function fn1() {var a = 4function fn2() {console.log(++a)}return fn2
}
var f = fn1()
f()
解决方法:
在执行完成之后设置为null
function fn1() {var a = 4function fn2() {console.log(++a)}return fn2
}
var f = fn1()
f()
f = null
4.事件监听未被移除
例如:
function addEvent (){const node = document.getElementById('warp');node.addEventListener('touchmove',()=>{console.log('In Move');})
}const onTouchEnd = (){const node = document.getElementById('warp');node.
}useEffect(()=>()=>{const node = document.getElementById('warp');node.removeEventListener('touchmove');
}) // 类似react 生命周期函数: componentWillUnmount
render(<div id='warp' onTouchEnd={onTouchEnd}>// code...
</div>)
5.console.log
因为console.log的对象是不能被垃圾回收的
console.log("123");
6.缓存
建议所有缓存都设置好过期时间,如果缓存过多的话也会造成内存泄漏
什么是javascript内存泄漏?以及解决方法相关推荐
- ionic3生产打包javascript内存溢出的解决方法
ionic3生产打包javascript内存溢出的解决方法 参考文章: (1)ionic3生产打包javascript内存溢出的解决方法 (2)https://www.cnblogs.com/wei- ...
- Android 常见内存泄漏及解决方法
Android中的内存泄漏: 先说一下为什么会出现内存泄漏: Android程序开发中,如果一个对象已经不需要被使用了,本该被回收时,而这时另一个对象还在持有对该对象的引用,这样就会导致无法被GC回收 ...
- Android之内存泄漏以及解决办法(持更)
Android之内存泄漏以及解决办法 文章链接:http://blog.csdn.net/qq_16628781/article/details/67761590 知识点: 单例造成的内存泄漏原因和解 ...
- python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法
Python内存泄漏和内存溢出的解决方法 发布时间:2020-10-30 23:08:34 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关Python内存泄漏和内存溢出的解决方 ...
- c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...
Go返回int64类型字段超出javascript Number范围的解决方法 最近在项目中,一个go服务给前端提供了一个接口,返回json格式数据,其中Int64字段会超出javascript Nu ...
- C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize
一.C# Winform应用程序占用内存较大解决方法整理(转) 原文: http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在 ...
- 使用 Android Studio 检测内存泄漏与解决内存泄漏问题
本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...
- linux内存泄漏通用排查方法
一. 概述 Linux下经常遇到内存泄漏的问题,尤其对C/C++开发人员来说是一个亘古不变的话题,现在介绍解决Linux内存泄漏问题的方法层出不穷,让人眼花缭乱,但是作为开发人员应该从本质上了解为 ...
- Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法
本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...
最新文章
- K项目轶事之开工第一天
- C++ 覆盖方法、重载方法的理解
- RDD, DataFrame or Dataset
- nginx和apache的伪静态区别
- .NET Core迁移前的准备工作
- 纯净版VS2015安装教程(适合初次安装或者重装系统后)
- python组合的语法_在Python中使用语法sugar-to-function组合是个好主意吗?
- java电信计费项目_基于jsp的电信计费-JavaEE实现电信计费 - java项目源码
- python爬取哔哩哔哩视频_python爬取哔哩哔哩小视频
- 计算机基础2008版第7次作业,中医药大学-计算机基础2008版-1-7次作业.doc
- leaflet 设置地图上某个标注位于页面最上层
- 计算机管理员工作目标任务书,毕业论文任务书中主要任务及目标怎么写
- 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
- RTK固定解什么意思
- setContentView(R.layout.main)在Android里面,这句话是什么意思?
- 计算机维修耗材管理,中国建设银行驻马店分行计算机耗材管理办法.doc
- 杭州记忆 | 科达为G20做的三件事
- 文案女王彭芳如何转变为“百万发售系统”创始人?我们来探个究竟!
- 计算机毕业设计Node.js+Express郑州市智慧农贸市场管理系统(源码+程序+lw+远程调试)
- opencv学习(四十三)之图像的矩moments()