内存中的堆栈和数据结构堆栈区别

堆栈的认识

  • 1.内存中的堆栈
    • 代码区
    • 静态数据区
    • 栈区
    • 堆区
  • 2.数据结构中的堆栈

内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。

1.内存中的堆栈

内存空间在逻辑上分为三部分:代码区静态数据区动态数据,动态数据区又分为栈区堆区

代码区

存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。

静态数据区

存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。

栈区

存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
例如:int method(int a) {int b;} 栈中存储参数a、局部变量b、返回值temp。

int main()
{
	int b;				//栈
	char s[] = "abc"; 	//栈
	char *p2;			//栈
}

其中函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量,比如上面代码中变量s的地址小于变量b的地址,p2地址小于s的地址。栈中存储的数据的生命周期随着函数的执行完成而结束。

堆区

new一个对象的引用地址存储在栈区,指向该对象存储在堆区中的真实数据。由程序员分配和回收(Java中由JVM虚拟机的垃圾回收机制自动回收)。
例如:Class Student{int num; int age;} main方法中Student stu = new Student();分配堆区空间中存储的该对象的num、age,变量stu存储在栈中,里面的值是对应堆区空间的引用或地址

堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面,即p2指向的地址并不一定大于p1所指向的内存地址,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系。堆中存储的数据的若未释放,则其生命周期等同于程序的生命周期。

关于堆上内存空间的分配过程,首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。

2.数据结构中的堆栈

栈:是一种连续存储的数据结构,特点是存储的数据先进后出。
堆:是一棵完全二叉树结构,特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。

参考博客: https://blog.csdn.net/K346K346/article/details/80849966

你可能感兴趣的:(java学习)