1、什么是内存管理
- 申请内存空间
- 使用内存空间
- 释放内存空间
JavaScript
在内存管理上与其它语言是类似的,也是经过了以上三个阶段。
2、什么是垃圾回收
如果程序在后续的执行中,发现某些对象不再被引用时就会被认为是垃圾
JavaScript
的执行引擎会回收这些垃圾对象所占用的内存空间,这个过程就是JavaScript
的垃圾回收。(如果某个对象一直可以被访问使用,就不是垃圾,而这种可以被访问到的对象,我们称之为可达对象
)
所谓可达对象
:指的就是可以被访问到的对象就是可达对象。
3、引用计数算法优缺点
优点
1. 发现垃圾立即回收
2. 最大限度的减少了程序的暂停
缺点
1. 无法回收循环引用的对象
2. 时间开销比较大
4、标记清除算法介绍
第一个阶段,遍历所有对象,找到活动的对象,然后进行标记
第二个阶段还是会遍历所有对象,并对没有标记的对象进行清除
5、V8引擎介绍
V8
引擎的性能是非常高的。性能高的原因:
第一:优秀的内存管理机制
第二:V8
引擎采用即时编译。也就是可以直接将javascript
代码翻译成机器码进行执行。这样导致的结果就是执行的速度非常快。
第三:V8
引擎内存是有上限的,在64位操作系统中,内存不超过1.5G
.对32位操作系统是不超过800M
.
6、V8引擎垃圾回收的机制
V8
引擎采用分代回收的思想,将内存分为新生代和老生代。
第一步: 在From空间中分配了3个对象A、B、C
第二步:GC
进来判断对象B没有其他引用,可以回收,对象A和C依然为活跃对象.
第三步:将活跃对象A、C从From空间复制到To空间
第四步:清空From空间的全部内存
第五步:交换From空间和To空间
第六步:在From空间中又新增了2个对象D、E
第七步:下一轮GC
进来发现对象D没有引用了,做标记
第八步:将活跃对象A、C、E从From空间复制到To空间
第九步:清空From空间全部内存
第十步:继续交换From空间和To空间,开始下一轮
当一个对象经过多次复制后仍然存活,它就会被认为是生命周期较长的对象,这种生命周期较长的对象会被移动到老生代中。
对象从新生代移动到老生代的过程就叫做晋升
。
对象晋升的条件主要有两个:
第一:对象从From空间复制到To空间时,会检查它的内存地址来判断这个对象是否已经经历过一次清除回收。如果已经经历过了,会将该对象从From空间移动到老生代空间中,如果没有,则复制到To空间
第二:当要从From空间复制一个对象到To空间时,如果To空间已经使用了超过25%,则这个对象直接晋升到老生代中。设置25%这个阈值的原因是当这次清除回收完成后,这个To空间会变为From空间,接下来的内存分配将在这个空间中进行。如果占比过高,内存就不够了,这样就会影响后续的内存分配。
7、全局变量问题
- 全局变量查找比较消耗时间
- 全局变量一直存储在内存中,降低了内存的使用
- 局部变量与全局变量重名的问题。