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

垃圾回收 #14

Open
dvlin-dev opened this issue Apr 4, 2022 · 1 comment
Open

垃圾回收 #14

dvlin-dev opened this issue Apr 4, 2022 · 1 comment

Comments

@dvlin-dev
Copy link
Owner

#标记清除法:
被引用的对象做标记,没有被引用的直接清除

分新生代和老生代

新生代

最开始都在新生代新生代的空间只能占1/2,另一半的空间做缓存

老生代

放到老生代的条件:

  • 被标记两次以后还没清除就放到老生代
  • 新生代的空间超过1/2之后

无论是新生代老是老生代 每次清除之后,都会进行规整,将散乱的对象堆在一起

@dvlin-dev
Copy link
Owner Author

完整

栈垃圾回收

当函数执行结束,JS引擎通过向下移动ESP指针(记录调用栈当前执行状态的指针),来销毁该函数保存在栈中的执行上下文(变量环境、词法环境、this、outer)。

ESP(Extended Stack Pointer)为扩展栈指针寄存器,是指针寄存器的一种,用于存放函数栈顶指针

堆垃圾回收

分类:新生代老生代

新生代

算法:Scavenge 算法 主要就是解决内存碎片的问题,将其进行整理到一起
原理:
1、把新生代空间对半划分为两个区域,一半是对象区域,一半是空闲区域。
2、新加入的对象都会存放到对象区域,当对象区域快被写满时,就需要执行一次垃圾清理操作。
3、先对对象区域中的垃圾做标记,标记完成之后,把这些存活的对象复制到空闲区域中
4、完成复制后,对象区域与空闲区域进行角色翻转,也就是原来的对象区域变成空闲区域,原来的空闲区域变成了对象区域。

对象晋升策略:

  • 经过两次垃圾回收依然还存活的对象,会被移动到老生区中。
  • 内存超过25%

老生代

算法:标记 - 清除(Mark-Sweep)算法
原理:
1、标记:标记阶段就是从一组根元素开始,递归遍历这组根元素,在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据。
2、清除:将垃圾数据进行清除。

算法:标记 - 整理(Mark-Compact)算法
原理:
1、标记:和标记 - 清除的标记过程一样,从一组根元素开始,递归遍历这组根元素,在这个遍历过程中,能到达的元素标记为活动对象。
2、整理:让所有存活的对象都向内存的一端移动

优化算法:增量标记(Incremental Marking)算法
原理: 为了降低老生代的垃圾回收而造成的卡顿
1、V8把一个完整的垃圾回收任务拆分为很多小的任务
2、让垃圾回收标记和 JavaScript 应用逻辑交替进行

other

引用计数垃圾收集这是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
该算法有个限制:无法处理循环引用。

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