Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

谈谈js垃圾回收机制 #72

Open
kekobin opened this issue Apr 19, 2020 · 0 comments
Open

谈谈js垃圾回收机制 #72

kekobin opened this issue Apr 19, 2020 · 0 comments

Comments

@kekobin
Copy link
Owner

kekobin commented Apr 19, 2020

在计算机科学中,垃圾回收(英语:Garbage Collection,缩写为GC)是一种自动的内存管理机制。当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源管理,称为垃圾回收(garbage collection)

JavaScript 中内存管理的主要概念是可达性。
简单地说,“可达性” 指就是那些以某种方式可访问或可用的值,它们被保证存储在内存中。

内部算法
基本的垃圾回收算法称为“标记-清除”,定期执行以下“垃圾回收”步骤:

  • 垃圾回收器获取根并“标记”(记住)它们。
  • 然后它访问并“标记”所有来自它们的引用。
  • 然后它访问标记的对象并标记它们的引用。所有被访问的对象都被记住,以便以后不再访问同一个对象两次。
  • 以此类推,直到有未访问的引用(可以从根访问)为止。
  • 除标记的对象外,所有对象都被删除。

垃圾回收算法分为以下几种

一、 标记-清除算法 Mark-Sweep GC

  • 标记阶段:从根集合出发,将所有活动对象及其子对象打上标记
  • 清除阶段:遍历堆,将非活动对象(未打上标记)的连接到空闲链表上

image

二、标记-压缩 Mark-Compact
和“标记-清除”相似,不过在标记阶段后它将所有活动对象紧密的排在堆的一侧(压缩),消除了内存碎片, 不过压缩是需要花费计算成本的。如下图过程,标记后需要定位各个活动对象的新内存地址,然后再移动对象,总共搜索了3次堆。

image

三、引用计数 Reference Counting
引用计数,就是记录每个对象被引用的次数,每次新建对象、赋值引用和删除引用的同时更新计数器,如果计数器值为0则直接回收内存。 很明显,引用计数最大的优势是暂停时间短

四、 GC 复制算法

将堆分为两个大小相同的空间 From 和 To, 利用 From 空间进行分配,当 From 空间满的时候,GC将其中的活动对象复制到 To 空间,之后将两个空间互换即完成GC。

image

常见的内容泄漏原因

  • 全局变量照成内存泄露
  • 未销毁的定时器和回调函数照成内存泄露
  • 闭包照成内存泄露
  • DOM 引用照成内存泄露 (elem被引用后删除了,造成泄漏)

js堆栈

  1. 基本类型:Undefined、Null、Boolean、Number 和 String,这5中基本数据类型可以直接访问,他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配。
  2. 引用类型:即存放在堆(heap)内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。
var obj1 = {name:'bangbang',age:18};
var b = obj1;
var c = obj1.age;

image

js解析时变量提升,obj1、b、c都会在栈内容中分配。

参考

前端面试:谈谈 JS 垃圾回收机制

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant