堆,栈,堆栈
下面主要从数据结构书中所说的堆,栈,树以及计算机操作系统中的栈,堆说。
一、数据结构中的堆,栈
数据结构中的堆,栈,树,是一个概念,是逻辑存在的,也就只是一个名字,不是物理存在的。
1、堆(heap):
堆有大根堆和小根堆,堆是一种特殊的树,它每个结点都有一个值,堆的特点是根结点的值最小(或最大),且根结点的两个子树也
是一个堆。就类似一堆东西一样,按照由大到小(或由小到大)“堆”起来。
大根堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。
小根堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。
2、栈(stack)
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压
入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的
插入与删除操作中,不需要改变栈底指针。
二、内存管理中堆(heap),栈(stack)
1.堆栈空间分配
栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三、JAVA中的堆(heap)、栈(stack)
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
3.由 Java 虚拟机的自动垃圾回收器来管理
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。