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

V8的垃圾回收器 #42

Open
jinzhepro opened this issue Apr 21, 2023 · 0 comments
Open

V8的垃圾回收器 #42

jinzhepro opened this issue Apr 21, 2023 · 0 comments

Comments

@jinzhepro
Copy link
Owner

垃圾回收算法

  1. 遍历GC Root(window,DOM,栈等)标记活动对象和非活动对象

  2. 回收非活动对象所占据的内存

  3. 内存整理

新生代和老生代

在V8中,会把堆分成新生代和老生代两个区域

  • 新生代通常只支持1~8M的容量,存放生存时间短的对象,由副垃圾回收器负责。

  • 老生代通常容量很大,存放生存时间长的对象,由主垃圾回收器负责。

Scavenge 算法(新生代)

在新生代中被划分为对象区和空闲区,新加入的对象全部加入对象区,当对象区快被写满时,就要进行一次垃圾回收操作。

75329eceafd88573097f8d073430bc9d

回收过程

因为要做频繁的复制操作,所以新生代一般设置容量较小。

副垃圾回收器还会采用对象晋升策略,移动两次仍然还存在就把它移动到老生代中去。

797db43b27c8a6add1ffa540910c7ebd-1024x576

  1. 垃圾标记
  2. 副垃圾回收器把活动对象复制到空闲区,整理
  3. 两个区做一次交换,对象区变成空闲区,空闲区变成对象区
  4. 抹掉空闲区

标记算法(老生代)

  • 标记-清除从根开始遍历,标记那些不能被到达的元素,直接清除掉。会出现内存碎片所以接下来要整理操作。
  • 标记-整理标记活动对象,将它们移动到一端,然后清理掉后面的内存。

垃圾回收器的优化

垃圾回收是运行在主线程上的,所以进行垃圾回收时,会造成卡顿。

  • 并行回收,开多个线程同时进行
  • 增量回收,将垃圾收集分解成更小的颗粒,穿插的进行,一次只进行一小部分操作。
  • 并发回收,在主线程内,辅助线程可以在后台完成垃圾回收操作。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant