内存管理

内存管理

  1. 生命周期
    (1) 分配申请所需要的内存
    (2) 使用分配的内存(存放对象等)
    (3) 不需要使用内存时,进行释放

  2. JS分配内存
    (1) 在声明变量时自动分配内存
    (2) 基础数据类型和复杂(引用)数据类型内存的分配
    i. 基础数据类型存放在栈内存里
    ii.复杂数据类型会在内存中开辟一个空间,将数据存放在空间里并且返回这个空间的地址指针给变量进行引用

  3. 垃圾回收
    定义: 因为内存大小是有限的,所以当内存不再需要的时候需要将其进行释放,用来减少内存空间的占用
    JS内置了垃圾回收机制:垃圾回收器(GC [Garbage Collection])
    GC不是释放一个内存空间就销毁一次而是会在某个时间段内统计不需要的内存集中销毁

  4. Q: 垃圾回收器如何去筛选不用的内存进行回收?
    A: GC算法

    1. 常见的GC算法
      引用计数: 声明一个变量,当任意其它变量引用了该变量,则会在retain count进行计数,当引用指针不指向该内存是,retain count就会进行相应数量的减少,当计数为0时就会被人为是垃圾进行回收

      弊端:容易造成循环引用,相互之间一直引用着,造成内存泄露

      var obj1 = { name:'nano',obj:obj2 }
      var obj2 = { name:'roily',obj:obj1 }
      这样两个对象就一直在循环引用着对方
      当然可以直接 obj1 = null 进行释放,但是如果忘记就会造成内存泄漏

    标记算法[JS的主导GC算法]: 设置一个根对象(root object),垃圾回收器会定期从这个根开始,查找所有从根开始引用到的对象,对于那些没有引用的对象则会人为 是不可用对象,进行垃圾回收

    优势: 解决了对象之间的循环引用问题。如果从根开始查找标记一直到最后,无法查找到这几个对象在根线路中,那么这几个循环对象就会被视为不可用对象


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!