Js的GC机制
Js的GC机制
在Js七种基本类型中的引用类型Object的变量其占据内存空间大且大小不固定,在堆内存中实际存储对象,在栈内存中存储对象的指针,对于对象的访问是按引用访问的。在栈区中执行的变量等是通过值访问,当其作用域销毁后变量也就随之销毁,而使用引用访问的堆区变量,在一个作用域消失后还可能在外层作用域或者其他作用域仍然存在引用,不能直接销毁,此时就需要通过算法计算该堆区变量是否属于不再需要的变量,从而决定是否需要进行内存回收,在Js中主要有引用计数与标记清除两种垃圾回收算法。
引用计数算法
对于引用计数垃圾回收算法,把对象是否不再需要简化定义为该对象有没有其他变量或对象引用到它,如果没有引用指向该对象,该对象将被垃圾回收机制回收。在这里,对象的概念不仅特指JavaScript对象,还包括函数作用域或者全局词法作用域。引用计数垃圾回收算法使用比较少,主要是在IE6与IE7等低版本IE浏览器中使用。
var obj = {
a : {
b: 11
}
}
// 此时两个对象被创建,一个作为另一个的a属性被引用称为对象1,另一个被obj变量引用称为对象2
// 此时两个对象都有被引用的变量,都不能回收内存
var obj2 = obj;
// 此时对于obj所引用的对象2,已经有obj与Obj2两个变量的引用
obj = null;
// 将obj对于对象2的引用解除,此时对象2还存在obj2一个引用
var a2 = obj2.a;
// 引用对象1,此时对象1有a与a2两个引用
obj2 = null;
// 解除对象2的一个引用,此时对象2的引用数量为0,可以被垃圾回收
// 对象2的a属性引用被解除,此时对象1只有a2一个引用
a2 = null;
// 解除a2对于对象1的引用,此时对象1可以被垃圾回收
但是对于引用计数垃圾回收算法有个限制,当对象循环引用时,就会造成内存泄漏,也就是引用计数垃圾回收算法无法处理循环引用的对象。
function funct() {
var obj = {}; // 命名为对象1,此时引用数量为1
var obj2 = {}; // 命名为对象2,此时引用数量为1
obj.a = obj2; // obj的a属性引用obj2,此时对象2的引用数量为2
obj2.a = obj; // obj2的a属性引用obj,此时对象1的引用数量为2
return 1;
// 此时执行栈的obj变量与obj2变量被销毁,对象1与对象2的引用数量减1
// 对象1的引用数量为1,对象2的引用数量为1,两个对象都不会被引用计数算法垃圾回收
}
funct();
// 两个对象被创建,并互相引用,形成了一个循环,它们被调用之后会离开函数作用域,所以它们已经不再需要了,可以被回收了,然而引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。
标记清除算法
对于引用计数垃圾回收算法,把对象是否不再需要简化定义为该对象是否可以获得,该算法设置一个叫做根root的对象,在Javascript里根是全局对象,垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象,以此不断向下查找。从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象,这样便解决了循环引用的问题。所有现代浏览器都使用了标记清除垃圾回收算法,所有对JavaScript垃圾回收算法的改进都是基于标记清除算法的改进。
- 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。
- 然后,它会去掉运行环境中的变量以及被环境中变量所引用的变量的标记。
- 此后,依然有标记的变量就被视为准备删除的变量,原因是在运行环境中已经无法访问到这些变量了。
- 最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://www.jianshu.com/p/18532079bc2a
https://segmentfault.com/a/1190000014383214
https://www.cnblogs.com/libin-1/p/6013490.html
https://www.oschina.net/question/253614_2216515
http://www.ruanyifeng.com/blog/2017/04/memory-leak.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management
Js的GC机制的更多相关文章
- 理解 Node.js 的 GC 机制
<深入浅出Node.js>第五章<内存控制>阅读笔记 随着 Node 的发展,JavaScript 的应用场景早已不再局限在浏览器中.本文不讨论网页应用.命令行工具等短时间执行 ...
- Java 内存区域和GC机制分析
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- 从C#垃圾回收(GC)机制中挖掘性能优化方案
GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实 ...
- 关于js内部运行机制的一本好书
读<单页Web应用一书>,第二章讲了js内部运行机制,感觉棒极了.之前读<你不知道的js>,看的云里雾里,似懂非懂.没想到单页Web一书将此内容讲的如此通俗易懂,好多困惑已久的 ...
- 浅谈你感兴趣的 C# GC 机制底层
本文内容是学习CLR.via C#的21章后个人整理,有不足之处欢迎指导. 昨天是1024,coder的节日,我为自己coder之路定下一句准则--保持学习,保持自信,保持谦逊,保持分享,越走越远. ...
- GC基本算法及C++GC机制
前言 垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾.在程序员看来,垃圾就是不再被引用的对象.自动回收垃圾的过程则称为垃圾收集(garbage collectio ...
- Java 内存区域和GC机制
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- Java系列笔记(3) - Java 内存区域和GC机制
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- 引用计数gc机制使用不当导致内存泄漏
上一篇文章找同事review了一下,收到的反馈是铺垫太长了,我尽量直入正题,哈哈 最近dbd压测时发现内存泄漏,其实这个问题去年已经暴露了,参见这篇博客[压测周].当时排查不够仔细,在此检讨下.关于d ...
- JS的解析机制
JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就 ...
随机推荐
- [转帖]linux audit审计(7-1)--读懂audit日志
https://www.cnblogs.com/xingmuxin/p/8807774.html auid=0 auid记录Audit user ID,that is the loginuid.当我 ...
- [转帖]使用 EXISTS 代替 IN 和 inner join
在使用Exists时,如果能正确使用,有时会提高查询速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,使用Exists代替inner join例子: 在一般 ...
- [转帖]详解:Linux Chrony 设置服务器集群同步时间
https://www.linuxprobe.com/centos7-chrony-time.html 导读 Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认 ...
- [转帖]【MySQL 8】MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了!
https://juejin.cn/post/7111255789876019208 MySQL 8新特性 选择MySQL 8的背景:MySQL 5.6已经停止版本更新了,对于 MySQL 5.7 版 ...
- [转帖]Sysbench - 一种系统性能benchmark
SysBench是一款开源的.跨平台的.模块化的.多线程的性能测试工具,通过高负载地运行在数据库上,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.用于评估操作系统的性能参数. 1 sysb ...
- Python学习之四_部分battery的学习
Python学习之四_部分battery的学习 CentOS升级pip的方法 yum install python3 之后, 一般centos的版本都很低, 有时候很多module 是无法安装的. 一 ...
- 高性能Redis服务器注意事项
摘要 昨天简单理了理安装与配置相关的 但是很多比较重要的核心性能参数并没有进行学习与探讨 就基于昨天理解不深入的地方进行进一步的学习与了解 希望能够提高Redis-Server的性能. 第一部分: 规 ...
- Oracle表数量对数据泵备份恢复速度的影响情况
Oracle表数量对数据泵备份恢复速度的影响情况 背景 随着公司产品交付后的时间越来越久. 数据库的备份恢复速度会越来越慢. 最开始一直认为是因为数据量导致的. 但是最近发现, 如果只是将数据库表的量 ...
- 解决Word等打开嵌入的文件提示 包含有害内容 无法打开的问题
最近打开文件时提示: 从网上找了一下 最简单的解决办法是: 新建一个文件, 输入如下内容 导入注册表 每次打开时不进行 文件有效性的检查即可. 为了省事 我多加了几个版本的 如果是excel 将 w ...
- 【行云流水线】满足你对工作流编排的一切幻想~skr
流水线模型 众所周知,DevOps流水线(DevOps pipeline)的本质是实现自动化工作流程,用于支持软件开发.测试和部署的连续集成.交付和部署(CI/CD)实践.它是DevOps方法论的核心 ...