JavaScript内存管理机制

JavaScript 内存机制

JavaScript的内存管理机制是:

   内存基元在变量(对象,字符串等等)创建时分配,然后在他们不再被使用时“自动”释放。
   JS内存空间分为栈(stack)、堆(heap)、池(一般也会归类为栈中)。
   其中栈存放变量,堆存放复杂对象,池存放常量。

基础数据类型与栈内存

JS中的基础数据类型,这些值都有固定的大小,往往都保存在栈内存中(闭包除外),由系统自动分配存储空间。
可以直接操作保存在栈内存空间的值,基础数据类型都是按值访问
数据在栈内存中的存储与使用方式类似于数据结构中的堆栈数据结构,遵循***后进先出的原则***。

引用数据类型与堆内存

与其他语言不同,JS的引用数据类型,比如数组Array,它们值的大小是不固定的。引用数据类型的值是保存在堆内存
中的对象。JS不允许直接访问堆内存中的位置,因此不能直接操作对象的堆内存空间。在操作对象时,实际上是在操
作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,粗浅地理解为保存在栈内
存中的一个地址,该地址与堆内存的实际值相关联。
当我们要访问堆内存中的引用数据类型时,首先是从栈中获取了该对象的地址引用(或者地址指针),然后再从堆内存
中取得需要的数据。 

内存的生命周期

内存分配:声明变量、函数、对象的时候,系统会自动为它们分配内存
内存使用:即读写内存,也就是使用变量、函数等
内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存

内存回收

JavaScript有自动垃圾收集机制,就是找出那些不再继续使用的值,然后释放其占用的内存。垃圾收集器会每隔固定的
时间段就执行一次释放操作。在JavaScript中,最常用的是通过标记清除的算法来找到哪些对象是不再继续使用的。

在局部作用域中,当函数执行完毕,局部变量也就没有存在的必要了,因此垃圾收集器很容易做出判断并回收。但是全
局变量什么时候需要自动释放内存空间则很难判断,因此在开发中,需要尽量避免使用全局变量,以确保性能问题。

以Google的V8引擎为例,在V8引擎中所有的JAVASCRIPT对象都是通过堆来进行内存分配的。当我们在代码中声明变
量并赋值时,V8引擎就会在堆内存中分配一部分给这个变量。如果已申请的内存不足以存储这个变量时,V8引擎就会
继续申请内存,直到堆的大小达到了V8引擎的内存上限为止(默认情况下,V8引擎的堆内存的大小上限在64位系统中
为1464MB,在32位系统中则为732MB)。

垃圾回收算法

核心思想就是如何判断内存已经不再使用了

标记清除算法

标记清除算法就是从根部(在JS中就是全局对象)出发定时扫描内存中的对象。
凡是能从根部到达的对象,都是还需要使用的。那些无法由根部出发触及到的对象被标记为不再使用,稍后进行回收。

内存泄露

对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,
重则导致进程崩溃。 不再用到的内存,没有及时释放,就叫做内存泄漏。

你可能感兴趣的:(JavaScript内存管理机制)