文章目录
一、内存
在硬件级别上,计算机内存由大量触发器组成。每个触发器包含几个晶体管,能够存储一个位。单个触发器可以通过唯一标识符寻址,因此我们可以读取和覆盖它们。因此,从概念上讲,我们可以把我们的整个计算机内存看作是一个巨大的位数组,我们可以读和写。
在JavaScript中我们无需在意内存的读写操作,因为这些Chrome都会帮我们处理好,我们需要做的就是避免变量或属性不能被正常回收即可。
二、生命周期
无论是什么程序语言,大家对内存的生命周期规定基本一致。
- 分配你所需要的内存
- 使用分配到的内存(读、写)
- 不需要时将其释放\归还
分配 使用 释放
三、内存泄漏
现代的高级语言绝大部分都是具备自动GC的能力的,如果发生了内存的泄漏,最大可能是由于疏忽或错误造成程序未能释放已经不再使用的内存导致的。
如果内存不需要的时候,如果此时没有被释放,那么就会造成内存泄漏了。
简单总结一下:内存泄漏就是无用的变量占据着内存,无法释放归还内存。严重的时候甚至造成页面卡顿,崩溃。
-
堆栈溢出
当储存的数据导到某一限制时就会造成堆栈溢出 -
内存泄漏
当不断向堆中存储数据,而不进行清理,这就是内存泄漏
四、内存回收(垃圾回收)机制
内存回收我们一般也称为垃圾回收即GC(Garbage Collection)。
内存泄漏一般都是发生在这一步,虽说现在的GC机制已经能回收绝大部分垃圾内存,但是还是存在回收不了的情况,此时我们就需要去手动清理。
下面说一下两种常见的GC算法
1.引用计数垃圾收集
这是最初级的垃圾收集算法。
此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。
如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
例子:
var o = {
a: {
b:2
}
};
// 两个对象被创建,一个作为另一个