Javascript 内存分配

239 阅读4分钟

内存分配

javascript中内存有两种,叫做栈内存和堆内存

基础数据类型(Number,String,Boolean,null,undefined)都是属于栈内存

栈内存

    1. 栈内存是一种线性数据结构,先进后出

  • 2. 存在栈里的内存有固定的内存大小
    1. 按值访问,内存由系统自动分配和释放

堆内存

数组,对象,function全部存储在堆内存中。堆内存中的数据结构是无序的,只需要知道key即可知道对应的value。

存入堆内存的变量,值大小不一定;

栈内存中存的变量名指向该堆内存访问地址;

读取堆内存步骤

  1. 在栈内存中,获得引用地址;
  2. 根据引用地址,读取堆内存对应数据;

栈堆内存比较

  1. 堆内存动态分配内存,不会自动释放;栈内存大小自动分配(且固定),并且会自动释放;
  2. 栈内存是有序的,后进先出;堆内存无序;
  3. 栈内存彼此独立,互相不影响;堆内存都是使用同一个地址指向同一块内存;

垃圾回收

引用计数法

当声明一个变量,并且将一块堆内存的引用地址赋予这个变量时候,这块堆内存的引用次数+1。当这块内存再被别的变量引用的时候,对应堆内存计数器再+1。若引用该堆内存地址的变量,改变了引用地址,则计数器-1。当垃圾回收器运行的时候,会清除所有引用为0的堆内存。

缺点:

  1. 无法评估计数器所需要的内存大小;
  2. 无法解决循环引用的问题

循环引用问题

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 撕逼,有良好的技术氛围,业界大牛云集,团队成员都能获得相对好的技术成长。

平时工作

负责抖音、抖音火山版、直播等业务大规模复杂业务场景的前端架构设计、实现和优化

  1. 负责PC、H5、Hybrid、App Native、BFF、RPC等一种或几种技术场景的架构;
  2. 制定开发规范,工程化体系搭建及优化,提升开发效率、质量和性能,保障业务稳定运行;
  3. 发现现有流程及架构的问题,并持续进行优化;
  4. 解决业务遇到的技术痛点和难点;
  5. 跟进业内前沿技术,保证团队技术的先进性。

职位要求

  1. 本科及以上学历,计算机及相关专业;计算机基础扎实,熟悉数据结构、网络等;
  2. 有一定的架构和方案设计能力及经验,具备一定的方案沟通和推动能力;
  3. 对后端技术有一定了解,熟悉一门后端语言(java/go等);
  4. 对前端工程化(例如构建方面:webpack、rollup等)、Nodejs、渲染框架(例如react或vue等)、中后台搭建系统等至少其一有一定深度的实践经验者优先;
  5. 有大型网站架构经验者优先;有较高的技术热情和积极性者优先。

加分项

  1. 参与或主导过优秀的开源项目;
  2. 有优秀的技术博文、博客。

有意者可以添加我微信说明来意:

image.png