内存分配
javascript中内存有两种,叫做栈内存和堆内存
基础数据类型(Number,String,Boolean,null,undefined)都是属于栈内存
栈内存
-
- 栈内存是一种线性数据结构,先进后出
- 2. 存在栈里的内存有固定的内存大小
-
- 按值访问,内存由系统自动分配和释放
堆内存
数组,对象,function全部存储在堆内存中。堆内存中的数据结构是无序的,只需要知道key即可知道对应的value。
存入堆内存的变量,值大小不一定;
栈内存中存的变量名指向该堆内存访问地址;
读取堆内存步骤
- 在栈内存中,获得引用地址;
- 根据引用地址,读取堆内存对应数据;
栈堆内存比较
- 堆内存动态分配内存,不会自动释放;栈内存大小自动分配(且固定),并且会自动释放;
- 栈内存是有序的,后进先出;堆内存无序;
- 栈内存彼此独立,互相不影响;堆内存都是使用同一个地址指向同一块内存;
垃圾回收
引用计数法
当声明一个变量,并且将一块堆内存的引用地址赋予这个变量时候,这块堆内存的引用次数+1。当这块内存再被别的变量引用的时候,对应堆内存计数器再+1。若引用该堆内存地址的变量,改变了引用地址,则计数器-1。当垃圾回收器运行的时候,会清除所有引用为0的堆内存。
缺点:
- 无法评估计数器所需要的内存大小;
- 无法解决循环引用的问题
循环引用问题
function mm () {
const a = {};
const b = {};
a.anotherB = b;
b.anotherA = a;
}
即使mm这个方法执行完毕,作用域已经消失,但a和b两个的引用计数依旧不为0,这两块的内存永远不会被回收。
标记清除法
当声明一个变量时候,标记这个变量“进入环境”。当变量离开环境时,标记其为“离开环境”。垃圾回收器开始工作的时候,会回收所有标记为“离开环境”的内存。
目前,IE、Firefox、Opera、Chrome和Safari的JavaScript实现使用的都是标记清除式的垃圾回收策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。
招聘!!!
字节跳动互娱基础架构团队招人啦!北京、深圳、杭州都有岗位!
我们是谁
字节成立最早的前端架构团队,目前规模最大,做的最专业,手里直接有大几百人的前端业务团队,产品 DAU 上亿级别,每天不用和 PM、UI 撕逼,有良好的技术氛围,业界大牛云集,团队成员都能获得相对好的技术成长。
平时工作
负责抖音、抖音火山版、直播等业务大规模复杂业务场景的前端架构设计、实现和优化
- 负责PC、H5、Hybrid、App Native、BFF、RPC等一种或几种技术场景的架构;
- 制定开发规范,工程化体系搭建及优化,提升开发效率、质量和性能,保障业务稳定运行;
- 发现现有流程及架构的问题,并持续进行优化;
- 解决业务遇到的技术痛点和难点;
- 跟进业内前沿技术,保证团队技术的先进性。
职位要求
- 本科及以上学历,计算机及相关专业;计算机基础扎实,熟悉数据结构、网络等;
- 有一定的架构和方案设计能力及经验,具备一定的方案沟通和推动能力;
- 对后端技术有一定了解,熟悉一门后端语言(java/go等);
- 对前端工程化(例如构建方面:webpack、rollup等)、Nodejs、渲染框架(例如react或vue等)、中后台搭建系统等至少其一有一定深度的实践经验者优先;
- 有大型网站架构经验者优先;有较高的技术热情和积极性者优先。
加分项
- 参与或主导过优秀的开源项目;
- 有优秀的技术博文、博客。
有意者可以添加我微信说明来意: