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构建 浏览器 ...
随机推荐
- .NET周刊【5月第4期 2025-05-25】
国内文章 .NET 的全新低延时高吞吐自适应 GC - Satori GC https://www.cnblogs.com/hez2010/p/18889954/the-new-satori-gc-f ...
- DeepSeek MOE 代码实现
前置知识: PyTorch 基础函数操作整理 1. topk 操作 功能: torch.topk 用于返回输入张量中指定维度上的前 k 个最大元素及其对应的索引. 示例代码: import torch ...
- xshell里面实现kafka一对一发送和接收消息测试
1.连接相关xshell,打开两个窗口一个给生产者用一个给消费者用 在生产者里输入:./kafka-console-producer.sh --broker-list localhost:9092 - ...
- SAP 发布简易REST 一:login验证
说明:这里没有使用ODATA,只是用最基础的HTTP和JSON来处理. 这篇为第一篇,所以这里来说说验证的一些东西. 创建SE24实施类,做http接口:ZCRM_REST 激活后,添加接口类:IF_ ...
- Spring Boot 启动优化实践
作者:vivo 互联网服务器团队- Liu Di 本文系统性分析并优化了一个Spring Boot项目启动耗时高达 280 秒的问题.通过识别瓶颈.优化分库分表加载逻辑.异步初始化耗时任务等手段,最终 ...
- 数栈技术文章分享:你居然是这样的initialValue
先说一下写着篇文章的契机,是因为回显,复杂表单的回显,让我觉得我对initialValue这个属性是有误解的. 一.initialValue的出处和定义 initialValue的出处: AntDes ...
- CF1989C Two Movies 题解
CF1989C Two Movies 贪心.如果某人对两部电影评分不一样,显然取评分高的那一个.如果是 \(1\) 和 \(0\) 或 \(1\) 和 \(-1\),那么显然取 \(1\).如果是 \ ...
- 扩散模型(Diffusion Model)原理概述
一.核心思想 扩散模型(Diffusion Model)是一种生成模型,受热力学中扩散过程的启发,通过模拟数据从噪声中逐步去噪的过程来生成样本.其核心思想是渐进式地添加噪声(正向过程)和逐步去噪( ...
- API开发平台,一站式API集成开发平台
RestCloud API开发平台集API服务.发布.开发.集成于一体的低代码一站式集成开发平台,是一款轻量级的Restful风格的API服务发布平台.通过RestCloud API开发平台可以快速的 ...
- ETL工具中JSON格式的转换方式
JSON的用处 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其设计初衷是为了提升网络应用中数据的传输效率及简化数据结构的解析过程.自其诞生以来,JSON ...