js内存泄漏几种方式及如何避免、内存溢出
https://blog.csdn.net/Judy_qiudie/article/details/82845692
一、什么是内存泄漏(memory leak)?
参考阮一峰老师博客:http://www.ruanyifeng.com/blog/2017/04/memory-leak.html
不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。
对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。
C 语言代码,malloc方法用来申请内存,使用完毕之后,必须自己用free方法释放内存。
这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制"(garbage collector)。
二、JavaScript 的垃圾收集机制
JavaScript中最常用的垃圾收集方式是标记清除(mark-and-sweep)。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占的内存,因为只要执行流进入相应的环境,就可能用到它们。而当变量离开环境时,这将其 标记为“离开环境”。
常见内存泄漏的原因 :
1、全局变量引起的内存泄漏
function leaks(){
leak = 'xxxxxx'; //leak 成为一个全局变量,不会被回收
}
'
运行运行
尤其当全局变量用于 临时存储和处理大量信息时,需要多加小心。如果必须使用全局变量存储大量数据时,确保用完以后把它设置为 null 或者重新定义。
与全局变量相关的增加内存消耗的一个主因是缓存。缓存数据是为了重用,缓存必须有一个大小上限才有用。高内存消耗导致缓存突破上限,因为缓 存内容无法被回收。
2、闭包引起的内存泄漏
闭包是 JavaScript 开发的一个关键方面:匿名函数可以访问父级作用域的变量。
var leaks = (function(){
var leak = 'xxxxxx';// 被闭包所引用,不会被回收
return function(){
console.log(leak);
}
})()
123456
'
运行运行
3、dom清空或删除时,事件未清除导致的内存泄漏
<div id="container"></div>
$('#container').bind('click', function(){
console.log('click');
}).remove();
//导致内存泄漏
<div id="container"></div>
$('#container').bind('click', function(){
console.log('click');
}).off('click').remove();
//把事件清除了,即可从内存中移除
子元素存在引用引起的内存泄漏:
假如你的 JavaScript 代码中保存了表格某一个 <td> 的引用。将来决定删除整个表格的时候,直觉认为 GC 会回收除了已保存的 <td> 以外的其它节点。
实际情况并非如此:此<td> 是表格的子节点,子元素与父元素是引用关系。由于代码保留了 <td> 的引用,导致整个表格仍待在内存中。
4、被遗忘的计时器或回调函数
var someResource = getData();
setInterval(function() {
var node = document.getElementById('Node');
if(node) {
// 处理 node 和 someResource
node.innerHTML = JSON.stringify(someResource));
}
}, 1000);
如果 id 为 Node 的元素从 DOM 中移除, 该定时器仍会存在, 同时, 因为回调函数中包含对 someResource 的引用, 定时器外面的 someResource 也不会被释放。
怎样避免内存泄露:
1)减少不必要的全局变量,或者生命周期较长的对象,及时对无用的数据进行垃圾回收;
2)注意程序逻辑,避免“死循环”之类的 ;
3)避免创建过多的对象 原则:不用了的东西要及时归还。
三、什么是内存溢出(out of menory)?
内存溢出(out of memory):程序要求的内存,超出了系统所能分配的范围。
如:我们用一个int型4字节的数据来装一个float型8字节的数据,就会产生内存溢出。不过我们在编程是可以强制类型转换int XX = (int)float;只取float 4字节数据给int。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Judy_qiudie/article/details/82845692
js内存泄漏几种方式及如何避免、内存溢出的更多相关文章
- 浏览器performance工具介绍及内存问题表现与监控内存的几种方式
一.GC的目的 为了实现内存空间的良性循环,performance提供多种监控方式监控内存 分析内存相关信息 当代码出现问题的时候及时定位到出现问题的代码块, 提高执行效率. preforcemanc ...
- Linux进程分配内存的两种方式--brk() 和mmap()
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- 进程分配内存的两种方式--brk() 和mmap()(不设计共享内存)(转)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏
转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...
- [C]C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...
- C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...
- Android 常见内存泄漏的解决方式
在Android程序开发中.当一个对象已经不须要再使用了,本该被回收时.而另外一个正在使用的对象持有它的引用从而导致它不能被回收.这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. ...
- js 函数定义三种方式
<p>Js 函数定义的三种方式:</p> <br> <p>方式一:function</p> <script type="te ...
- 使用Webpack加速Vue.js应用的4种方式
Webpack是开发Vue.js单页应用程序的重要工具. 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能. 其中介绍下面四种方式: 单个文件组件 优化Vue构建 浏览器 ...
随机推荐
- AI图像生成的"套娃"生意:一个月入240万美元的AI工具站
AI图像生成的"套娃"生意:一个月入240万美元的AI工具站 今天和大家分享一个让我既佩服又警醒的案例--flux1.ai. 这个项目用最简单粗暴的方式,在AI图像生成这个红海市场 ...
- 抖音主播选品到复盘:8款增长工具提升直播ROI
随着短视频和直播电商的快速崛起,抖音直播成为品牌和主播们争相布局的风口.想要在激烈的直播竞争中脱颖而出,主播不仅需要精准选品,更要借助多样的增长工具,提升直播的观众转化和最终ROI(投资回报率).本文 ...
- Web前端入门第 67 问:JavaScript 中的面向对象编程
此 对象 非彼对象啊,不要理解错了哦~~ 面向对象编程 这个概念在 Java 编程语言中用得比较多,JS 同时支持 面向对象编程 和 函数式编程. 像大名鼎鼎的 React 和 Vue 他们都有两种开 ...
- Golang基础笔记八之函数
本文首发于公众号:Hunter后端 原文链接:Golang基础笔记八之函数 本篇笔记介绍 Golang 里函数相关的内容,以下是本篇笔记目录: 函数的定义语法 函数返回值 可变参数函数 匿名函数 闭包 ...
- MKL普通矩阵运算示例及函数封装
本示例将介绍MKL中的矩阵乘法和求逆,使用MKL进行此类大型矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩 ...
- Windows 界面卡死,黑屏,处理方法
explorer-------打开资源管理器 windows 界面卡死的时候,就是黑屏,或者界面一卡一卡的时候 可以通过Win+R 运行 explorer
- sass 定义全局变量
定义变量文件 随便写一个scss文件,比如在 src/assets/var.scss $my-color: #00b96b; 打包工具配置 不同工具 如webpack.vite有不同的处理方式加载到全 ...
- 前端开发系列017-基础篇之Javascript原型对象
引用: javaScript是一门基于原型的语言,它允许对象通过原型链引用另一个对象来构建对象中的复杂性,JavaScript使用原型链这种机制来实现动态代理.当试图去引用某一个属性时,它会遍历整个原 ...
- 多Agent协作入门:顺序编排模式
大家好,我是Edison. 上一篇我们学习了Semantic Kernel中的并发编排模式,它非常适合并行分析.独立子任务并集成决策的任务场景.今天,我们学习新的模式:顺序编排. 顺序编排模式简介 在 ...
- [ThingsBoard] 3. 源码解读Actor
一.前言 本文基于 ThingsBoard 4.0.2 编写,对应提交Version set to 4.0.2(01c5ba7d37006e1f8a3492afbb3c67d017ca8dd3). 由 ...