js的内存管理机制

JavaScript08

js的内存管理机制,第1张

所谓内存管理,是 js 从创建变量到垃圾回收的一个过程。

分三种:

栈:存放变量,包括基础数据类型的变量及对象的指针

堆:存放引用数据类型的值

池:一般也归类为栈,保存常量

找出那些不再继续使用的变量,然后释放其占用的内存。

不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)

在Node中如果通过JavaScript使用内存操作时会发现实际只能使用部分内存(64位系统下约为1.4G,32位系统下约为0.7G),这种限制对于其他的服务端开发语言来说基本上都是不存在的。

而问题的原因在于Node是基于V8构建,所以在Node中使用对象都是通过V8自己的方式进行分配和管理。

而其内存管理机制在浏览器的场景下问题不大,但是对于Node,却使得Node有了这般限制。

老生代中用标记 - 清除(Mark-Sweep)的算法来处理。

首先是标记过程阶段,标记阶段就是从一组根元素开始,递归遍历这组根元素(遍历调用栈),在这个遍历过程中,能到达的元素称为活动对象,没有到达的元素就可以判断为垃圾数据.然后在遍历过程中标记,标记完成后就进行清除过程。它和副垃圾回收器的垃圾清除过程完全不同,这个的清除过程是删除标记数据。

清除算法后,会产生大量不连续的内存碎片。而碎片过多会导致大对象无法分配到足够的连续内存,于是又产生了标记 - 整理(Mark-Compact)算法,这个标记过程仍然与标记 - 清除算法里的是一样的,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,从而让存活对象占用连续的内存块。