javaScript中的垃圾回收机制
JavaScript 的内存管理
对于计算机程序语言,运行在对应的代码执行引擎上,使用内存过程大致逻辑是一样的,可以分为这三个步骤:
- 分配你所需要的系统内存空间;
- 使用分配到的内存进行读或者写等操作;
- 不需要使用内存时,将其空间释放或者归还。
在 JavaScript 中,当我们创建变量(对象,字符串等)的时候,系统会自动给对象分配对应的内存。
var a = 123; // 给数值变量分配栈内存
var etf = "ARK"; // 给字符串分配栈内存
// 给对象及其包含的值分配堆内存
var obj = {name: 'tom',age: 13
}; // 给数组及其包含的值分配内存(就像对象一样)
var a = [1, null, "PSAC"];
// 给函数(可调用的对象)分配内存
function sum(a, b){return a + b;
}
当系统经过一段时间发现这些变量不会再被使用的时候,会通过垃圾回收机制的方式来处理掉这些变量所占用的内存。
数据类型
在 JavaScript 中数据类型分为两类:简单类型和引用类型。
对于简单数据类型,内存是保存在栈(stack)空间中的;复杂数据类型,内存保存在堆(heap)空间中。
- 基本类型:这些类型在内存中会占据固定的内存空间,它们的值都保存在栈空间中,直接可以通过值来访问;
- 引用类型:由于引用类型值大小不固定(比如对象可以添加属性等),栈内存中存放地址指向堆内存中的对象,是通过引用来访问的。
总结来说:栈内存中的基本类型,可以通过操作系统直接处理;而堆内存中的引用类型,正是由于可以经常变化,大小不固定,因此需要 JavaScript 的引擎通过垃圾回收机制来处理。
Chrome 内存回收机制
在 Chrome 浏览器中,JavaScript 的 V8 引擎被限制了内存的使用,根据不同的操作系统(操作系统有 64 位和 32 位的)内存大小会不同,大的可以到 1.4G 的空间,小的只能到 0.7G 的空间。
至于为什么要去限制内存使用
大致是两个原因:V8 最开始是为浏览器而设计的引擎,早些年由于 Web 应用都比较简单,其实并未考虑占据过多的内存空间;另外又由于被 V8 的垃圾回收机制所限制,比如清理大量的内存时会耗费很多时间,这样会引起 JavaScript 执行的线程被挂起,会影响当前执行的页面应用的性能。
Chrome 的 JavaScript 引擎 V8 将堆内存分为两类新生代的回收机制和老生代的回收机制
新生代内存回收
新生代的内存回收的空间,在 64 位操作系统下分配为 32MB,正是因为新生代中的变量存活时间短,不太容易产生太大的内存压力,因此不够大也是可以理解的。首先系统会将分配给新生代的内存空间分为两部分,如下图所示。
图中左边部分表示正在使用的内存空间,右边是目前闲置的内存空间。当浏览器开始进行内存的垃圾回收时,JavaScript 的 V8 引擎会将左边的对象检查一遍。如果引擎检测是存活对象,那么会复制到右边的内存空间去;如果不是存活的对象,则直接进行系统回收。当左边的内存里没有对象的时候,等再有新生代的对象产生时,上面的部分左右对调,这样来循环处理。
如果是顺序放置的那比较好处理,可以按照上面所说的处理方式。但是如果是下图这样零散的场景。
图中橙色的块代表存活对象,白色地方代表未分配的内存。正常情况下,由于堆内存是连续分配的,但是也有可能出现上图的这种内存分配情况,这种零散的分配情况就造成了内存碎片,会影响比较大的内存对象的放置。
v8在这里使用了一个算法 Scavenge,它主要就是解决上图中内存碎片的情况,在通过算法处理过后,内存中对象的排布都会变成下图这个排列方式。
进行这样的算法处理,明显会让内存排布变得更整齐,这样就非常方便之后新来的对象的内存分配。
老生代内存回收
新生代中的变量如果经过回收之后依然一直存在,那么就会被放入到老生代内存中。
时间长了之后通过几个原因的判断,我们就会把这些变量进行 “晋升”,只要是已经经历过一次 Scavenge 算法回收的,就可以晋升为老生代内存的对象。
在进入老生代的内存回收机制中,就不能再用 Scavenge 的算法了(对于内存空间比较大的,不适合用 Scavenge 算法)。
而是采用了 Mark-Sweep(标记清除) 和 Mark-Compact(标记整理)的策略。
内存泄漏与优化
内存泄漏是指 JavaScript 中,已经分配堆内存地址的对象由于长时间未释放或者无法释放,造成了长期占用内存,使内存浪费,最终会导致运行的应用响应速度变慢以及最终崩溃的情况。这种就是内存泄漏。
- 过多的缓存未释放。
- 闭包太多未释放。
- 定时器或者回调太多未释放。
- 太多无效的 DOM 未释放。
- 全局变量太多未被发现。
这些现象会在开发或者使用中造成内存泄漏,以至于你的浏览器卡顿、不响应、页面打不开等问题产生。
注意事项:
- 减少不必要的全局变量,使用严格模式避免意外创建全局变量。
- 在你使用完数据后,及时解除引用(闭包中的变量,DOM 引用,定时器清除)。
- 组织好代码逻辑,避免死循环等造成浏览器卡顿、崩溃的问题。
javaScript中的垃圾回收机制相关推荐
- 浅谈V8引擎中的垃圾回收机制
浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...
- JavaScript 中的垃圾回收和内存泄露如何处理?| 技术头条
作者 | 浪里行舟 责编 | 郭芮 程序的运行需要内存.只要程序提出要求,操作系统或者运行时就必须供给内存.所谓的内存泄漏简单来说是不再用到的内存,没有及时释放.为了更好避免内存泄漏,我们先介绍Jav ...
- JavaScript中的垃圾回收和内存泄漏
前言 程序的运行需要内存.只要程序提出要求,操作系统或者运行时就必须供给内存.所谓的内存泄漏简单来说是不再用到的内存,没有及时释放.为了更好避免内存泄漏,我们先介绍Javascript垃圾回收机制. ...
- JavaScript具有自动垃圾回收机制
JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存. 正常的生命周期: 局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...
- JavaScript中的内存回收机制
JS的内存回收 在js中,垃圾回收器每隔一段时间就会找出那些不再使用的数据,并释放其所占用的内存空间. 以全局变量和局部变量来说,函数中的局部变量在函数执行结束后这些变量已经不再被需要,所以垃圾回收器 ...
- js中的垃圾回收机制
js中的垃圾回收机制 1.什么是堆.栈 一种数据结构,栈有先进后出的特性, 堆是用来存放复杂数据类型的地址(栈用来存放它的引用) 2.执行上下文与作用域链 执行上下文:全局执行上下文.函数执行上下文. ...
- 【转】JavaScript 中的垃圾回收和内存泄露如何处理
转自 https://blog.csdn.net/csdnnews/article/details/89596750?ops_request_misc=%257B%2522request%255Fid ...
- 简述python垃圾回收机制_python中的垃圾回收机制简述
2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...
- Java Jvm 中的垃圾回收机制中的思想与算法 《对Java的分析总结》-四
Java中的垃圾回收机制中的思想与算法 <对Java的分析总结>-四 垃圾回收机制 中的思想与算法 引用计算法 给对象中添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失 ...
- 一篇文章搞定java中的垃圾回收机制面试题
一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...
最新文章
- nginx实现,一推多用(rtmp推流,rtmp+flv+hls(m3u8)同时拉流),使用案例+使用方法
- 【公司金融课堂学习笔记】2、企业融资—风投如何影响企业价值
- Origin Pro轻松绘制小提琴图
- Splash 渲染引擎简介
- 岗位内推 | 美团语音交互部招聘NLP/知识图谱/语音识别等算法职位(可实习)...
- Tomcat实现session的代码逻辑分析
- GP学习(二)—Executing tools and Accesubg licensing0
- linux定时备份文件到指定文件夹,Linux定时备份数据库到指定邮箱的方法
- Python实现端口扫描
- Seaweedfs 详细说明
- 我分析了虎嗅网5万篇文章,发现这些秘密
- html5中video自动播放,H5:设置video自动播放
- 电子元器件识别(图解)
- 使用grep命令抓取报: memory exhausted(内存耗尽)
- 「需求广场」需求词更新明细(九)
- 用路由器实现不同vlan之间的通信
- 如何自建obs服务器,使用 Nginx+OBS 搭建rmtp直播服务器并进行直播
- navicat计划任务
- 如何通过Chrome查看网站登录 Cookie 信息
- ibm服务器vios系统,IBM VIOS login(IVM)
热门文章
- 专访Token经济设计专家叶开:Token设计画布与10大设计模式
- c语言的实验,c语言 实验1
- 控制台程序实现暂停功能
- Excel 2010画箱线图 Box-Plot
- 【文献学习】DeepReceiver: A Deep Learning-Based Intelligent Receiver for Wireless Communications in the Ph
- 三菱plc控制步进电机实例_「PLC案例」三菱FX3U与威纶通HMI的步进定位控制,附程序图~...
- Android对话框控件读写,Android 对话框控件
- Scintilla的使用c++ build
- MATLAB实现香农编码
- maikr博客伴侣全新发布,支持博客备份和博客搬家