堆是堆内存的简称。栈是栈内存的简称。
栈:基本变量的值存放在堆栈中,而存放在堆栈中的引用变量是数组或对象在堆中的地址。这就是为什么修改引用类型将始终影响指向该地址的其他引用变量的原因。(线性结构,后进先出)
优点:
(1)栈的内容由操作系统自动创建和回收,占用固定大小的空间,所以可以及时回收内存,相比之下更容易管理内存空间堆。
(2)与堆相比,访问速度更快,并且可以共享堆栈存储器中的数据。例如,如果同时声明了vara=1和varb=1,则先处理a,然后在栈中查找是否存在值为1的地址,如果没有,则打开一个地址为a值为1,然后a指向此地址。在处理b时,由于已经打开了值为1的地址,因此b也将指向相同的相同地址。
缺点:
与堆相比的缺点是堆栈中存储的数据的大小和生命周期必须确定,缺乏灵活性。
堆:堆内存中的对象不会随方法的结束而销毁,就算方法结束了,这个对象也可能会被其他引用变量所引用(参数传递)。创建对象是为了反复利用(因为对象的创建成本通常较大),这个对象将被保存到运行时数据区(也就是堆内存)。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。
优点:
(1)堆是操作系统动态分配的可变大小内存,方便存储和开辟内存空间。
(2)存储在堆中的对象不会被自动释放。它们通常由程序员分配和释放,或者可以通过垃圾回收机制进行回收,因此生命周期更加灵活。
缺点:
与堆栈相比,
的缺点是堆中数据的大小和生命周期不确定,杂乱无序。
栈是一种先进后出的数据结构,栈内存是一块内存,用来存放内存中的临时变量。当一个基本变量被声明时,它会被存储在堆栈内存中。例如,如果有这样一段代码,它们将以下表所示的形式存储在堆栈存储器中:
consta=1;
constb=1;
总结:
1.根据JS数据类型,基本数据类型(即值类型,包括:undefined、null、number、string、boolean、symbol)存放在栈中,引用类型(即:对象数组函数)存放在栈中堆。
2。基本数据类型有固定的大小和值并存储在堆栈中,而引用类型有未定义的大小,但其引用地址是固定的。因此,其地址存储在堆栈中并指向堆中的对象。
3.基本数据类型在当前环境执行结束时被销毁,而引用类型只有在引用变量不存在时才会被垃圾回收机制回收。
4。复制方法不同。值类型为深拷贝(deepcopy),引用类型为浅拷贝(shallowcopy),变量的拷贝实际上是通过引用传递的。
5.值类型不能添加属性和方法,而引用类型可以添加属性和方法。
6。如果值类型相等,可以使用==或===进行比较,但对于引用类型,甚至lets={};让s1={};但是因为它们的内存地址不一样,所以比较结果还是不相等。
—————————————————
(1)如果要堆溢出,比较简单,可以循环创建对象或者大对象;
(2)如果想要栈溢出,可以递归调用方法,这样随着栈深度的增加,JVM(虚拟机)保持很长的方法调用轨迹,直到内存不够分配,而发生堆栈溢出。
全新超实用性的Python零基础入门到就业体验课+视频+源码淘宝¥2购买已下架