JS栈内存与堆内存
㈠JavaScript变量
⒈分类
⑴JavaScript中的变量分为基本类型和引用类型。
⑵基本类型就是保存在栈内存中的简单数据段。
⑶引用类型指的是那些保存在堆内存中的对象。
⒉基本类型
基本类型有Undefined、Null、Boolean、Number 和String。
这些类型在内存中分别占有固定大小的空间,它们的值保存在栈空间,我们通过按值来访问的。
⒊引用类型
⑴引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。因此是按引用访问的。
⑵栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。
⑶由于这种值的大小不固定,因此不能把它们保存到栈内存中。
⑷但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。
⑸这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问
⑸当我们看到一个变量类型是已知的,就分配在栈里面,比如INT,Double等。
⑹其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。
⑺基本类型大小固定,引用类型大小不固定,分开存放使得程序运行占用内存最小。
㈡栈内存
⒈什么是栈内存?
栈内存:引擎执行代码时工作的内存空间,除了引擎,也用来保存基本值和引用类型值的地址。
⒉栈内存的简单介绍
⑴栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。
⑵栈内存:存放基本类型。
⑶基本类型在当前执行环境结束时销毁。
㈢堆内存
⒈什么是堆内存?
堆内存:用来保存一组无序且唯一的引用类型值,可以使用栈中的键名来取得。
⒉堆内存的简单介绍
⑴堆内存存储的对象类型数据对于大小这方面,一般都是未知的。
⑵因此当我们定义一个const对象的时候,我们说的常量其实是指针,就是const对象对应的堆内存指向是不变的,但是堆内存中的数据本身的大小或者属性是可变的。而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。
⑶ 堆内存:存放引用类型(在栈内存中存一个基本类型值保存对象在堆内存中的地址,用于引用这个对象。)
⑷引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时这个对象才被垃圾回收机制回收。
㈣JS中的堆内存与栈内存
⑴在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
⑵栈内存主要用于存储各种基本类型的变量;而堆内存主要负责像对象Object这种变量类型的存储。
⑶具体如下图:
㈤栈内存和堆内存的区别
1.定义不同
堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
2.特点不同
堆内存实际上指的就是优先队列的一种数据结构,第1个元素有最高的优先权;栈内存实际上就是满足先进后出的性质的数学或数据结构。栈内存是存取速度比堆要快,仅次于寄存器,栈数据可以共享。
3.范围不同
堆内存中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话动态分配堆内存,那就一直被占用。栈内存中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。