JS中栈和堆

140 阅读2分钟

栈和堆

栈(stack) :栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。

堆(heap) :动态分配的内存,大小不定也不会自动释放,存放引用类型,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针

image.png

栈和堆区别

:所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁。

优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享;
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

:堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。

内存分配和垃圾回收

垃圾回收机制需要程序运行时占用内存尽量最小。

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的变量都是放在栈内存中。

当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递很常见),则这个对象仍然不会被销毁,只有当一个对象没有任何变量引用它时,系统的垃圾回收机制才会在合适的时候回收它。

一般来说,栈内存线性有序存储、容量小、系统分配效率高。而堆内存中首先要在堆内存新分配存储区域,之后又要把指针储存到栈内存中,效率就相对低一些了。

垃圾回收,栈内存变量基本上用完就回收了,而堆内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才回收。