调用栈中的数据是如何回收的
- 原始类型的数据会分配到栈中
- 引用类型的数据会被分配到堆中
- 在执行代码的过程中,如果遇到了一个函数,js引擎会创建该函数的执行上下文,并将该函数的上下文压入调用栈中,与此同时,有一个记录当前执行状态的指针(称为ESP),指向调用栈中该函数的执行上下文,表示当前正在执行的函数。
- 当该函数执行结束之后,js会将esp下移,这个下移操作就是销毁函数执行上下文的过程。
- 总结:
js引擎会通过下移ESP来销毁函数保存在栈中的执行上下文。
堆中的数据是如何回收的
- 要回收堆中的垃圾数据,需要使用js中的垃圾回收器
- 代际假说
- 大部分对象在内存中存在的时间很短。( 简单来说,就是很多对象一经分配内存,很快就会变得不可访问 )
- 不死的对象,会活得更久。
- 分代理论
- V8会把堆分为新生代和老年代两个区域,新生代存放的是生存时间短的对象,老生代中存放生存时间久的对象。
- 新生代通常只支持1-8M的容量
- 副垃圾回收器:主要负责新生代的垃圾回收
- 主垃圾回收器:主要负责新生代的垃圾回收
- 垃圾回收期的工作流程(无论什么垃圾回收器,都有一套共同的执行流程)
-
- 标记空间中活动对象和非活动对象。
-
- 回收非活动对象所占据的内存。
-
- 内存整理。(频繁回收对象后,内存中会有大量不连续空间,称之为内存碎片,需要整理)
-
- 副垃圾回收器
- 主要负责新生区的垃圾回收。(通常情况下,大多数小的对象都会被分配到新生区,所以说这个区域虽然不大,但是垃圾回收很频繁)
- 用的是Scavenge算法:把新生代空间对半划分为两个区域,一半是对象区域,一半空闲区域
下次再写