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内存泄漏几种方式及如何避免、内存溢出的更多相关文章

  1. 浏览器performance工具介绍及内存问题表现与监控内存的几种方式

    一.GC的目的 为了实现内存空间的良性循环,performance提供多种监控方式监控内存 分析内存相关信息 当代码出现问题的时候及时定位到出现问题的代码块, 提高执行效率. preforcemanc ...

  2. Linux进程分配内存的两种方式--brk() 和mmap()

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  3. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  4. 进程分配内存的两种方式--brk() 和mmap()(不设计共享内存)(转)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  5. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...

  6. [C]C语言中的指针和内存泄漏几种情况

    引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...

  7. C语言中的指针和内存泄漏几种情况

    引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...

  8. Android 常见内存泄漏的解决方式

    在Android程序开发中.当一个对象已经不须要再使用了,本该被回收时.而另外一个正在使用的对象持有它的引用从而导致它不能被回收.这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. ...

  9. js 函数定义三种方式

    <p>Js 函数定义的三种方式:</p> <br> <p>方式一:function</p> <script type="te ...

  10. 使用Webpack加速Vue.js应用的4种方式

    Webpack是开发Vue.js单页应用程序的重要工具. 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能. 其中介绍下面四种方式: 单个文件组件 优化Vue构建 浏览器 ...

随机推荐

  1. AI图像生成的"套娃"生意:一个月入240万美元的AI工具站

    AI图像生成的"套娃"生意:一个月入240万美元的AI工具站 今天和大家分享一个让我既佩服又警醒的案例--flux1.ai. 这个项目用最简单粗暴的方式,在AI图像生成这个红海市场 ...

  2. 抖音主播选品到复盘:8款增长工具提升直播ROI

    随着短视频和直播电商的快速崛起,抖音直播成为品牌和主播们争相布局的风口.想要在激烈的直播竞争中脱颖而出,主播不仅需要精准选品,更要借助多样的增长工具,提升直播的观众转化和最终ROI(投资回报率).本文 ...

  3. Web前端入门第 67 问:JavaScript 中的面向对象编程

    此 对象 非彼对象啊,不要理解错了哦~~ 面向对象编程 这个概念在 Java 编程语言中用得比较多,JS 同时支持 面向对象编程 和 函数式编程. 像大名鼎鼎的 React 和 Vue 他们都有两种开 ...

  4. Golang基础笔记八之函数

    本文首发于公众号:Hunter后端 原文链接:Golang基础笔记八之函数 本篇笔记介绍 Golang 里函数相关的内容,以下是本篇笔记目录: 函数的定义语法 函数返回值 可变参数函数 匿名函数 闭包 ...

  5. MKL普通矩阵运算示例及函数封装

    本示例将介绍MKL中的矩阵乘法和求逆,使用MKL进行此类大型矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩 ...

  6. Windows 界面卡死,黑屏,处理方法

    explorer-------打开资源管理器 windows 界面卡死的时候,就是黑屏,或者界面一卡一卡的时候 可以通过Win+R 运行 explorer

  7. sass 定义全局变量

    定义变量文件 随便写一个scss文件,比如在 src/assets/var.scss $my-color: #00b96b; 打包工具配置 不同工具 如webpack.vite有不同的处理方式加载到全 ...

  8. 前端开发系列017-基础篇之Javascript原型对象

    引用: javaScript是一门基于原型的语言,它允许对象通过原型链引用另一个对象来构建对象中的复杂性,JavaScript使用原型链这种机制来实现动态代理.当试图去引用某一个属性时,它会遍历整个原 ...

  9. 多Agent协作入门:顺序编排模式

    大家好,我是Edison. 上一篇我们学习了Semantic Kernel中的并发编排模式,它非常适合并行分析.独立子任务并集成决策的任务场景.今天,我们学习新的模式:顺序编排. 顺序编排模式简介 在 ...

  10. [ThingsBoard] 3. 源码解读Actor

    一.前言 本文基于 ThingsBoard 4.0.2 编写,对应提交Version set to 4.0.2(01c5ba7d37006e1f8a3492afbb3c67d017ca8dd3). 由 ...