什么是内存管理
不管使用什么样的编程语言,在代码的执行过程中,都需要给它分配内存。有些语言会让我们手动管理,有些会自动帮助我们管理内存。
内存管理的生命周期
- 分配申请你需要的内存(申请)
- 使用分配的内存
- 不需要使用时,对其进行释放 (防止栈用尽等问题)
不同编程语言一、三步的不同实现
手动管理:比如C,C++ 需要手动给管理(maloc和free函数)
自动管理:比如Java,JS,Python会自动帮助我们管理
JS的内存管理
一般而言JS在定义变量时就帮助我们自动分配内存了。JS的基本数据类型会在执行时,分配在栈里面。
复杂的数据类型(对象等)会被存放在堆空间里。这个变量有一个引用(形如0x100这种十六进制的地址)指向内存堆里的位置。 这个引用我们也叫它指针。
JS的垃圾回收
对于那些不再使用的对象,我们称之为是垃圾,需要被回收,以释放更多的内存空间。
垃圾回收器我们简称为GC。
GC常用的算法
引用计数算法
某一对象设置一个存储计数器,只要有一个引用指向它,计数器就+1。如果计数器变为0的话内存就回收该对象。
但是引用计数算法存在一个问题,
循环引用:
就像一个双向链表一样,双方指针互相指向。
解决方法是给某一对象指针(引用)设为Null
标记清楚算法
该算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找到从根开始有引用到的对象,对于那些没有引用到的对象,就认为是不可用的对象。他可以很好的解决事件循环的问题。
如图 M N 就不可达
V8引擎采用的就是标记清楚,但是为了更好的优化,在这个算法上又增加了一些新的算法