×

堆和栈的区别 堆栈

堆栈与堆有什么区别?堆和栈的区别,分配释放

admin admin 发表于2022-06-14 14:13:32 浏览128 评论0

抢沙发发表评论

堆栈与堆有什么区别


堆栈与堆区别为:空间不同、地址方向不同、释放不同。

一、空间不同

1、堆栈:堆栈是自动分配变量,以及函数调用的时候所使用的一些空间。

2、堆:堆是是由malloc之类函数分配的空间所在地。

二、地址方向不同

1、堆栈:堆栈的地址方向是由高向低减少性扩展,有总长度大小限制。 

2、堆:堆的地址方向是由低向高增长性扩展,没有总长度大小限制。 

三、释放不同

1、堆栈:堆栈由编译器自动释放,存放函数的参数值,局部变量的值等。

2、堆:堆由程序员人工进行释放, 若程序员不释放,程序结束时可能由OS回收 。


堆和栈的区别,分配释放


堆一般是编程序时用malloc,new这样的函数申请的空间,然后程序用free,delete来释放
栈用于程序在调用子程序时保护现场;当子程序包含参数、子程序内包含变量定义、程序包含大括号内变量定义这些情况时,会在堆栈申请空间,然后在结束调用、程序执行出大括号时自动释放,一般栈的使用是高级语言程序不涉及的,由编译程序安排分配和释放。
-堆栈

Java堆与栈的区别和联系


在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。

在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

java中变量在内存中的分配

1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期--一直持续到整个“系统“关闭

2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的“物理位置“。 实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

附:java的内存机制

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
  堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
  这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
-堆和栈的区别