Java虚拟机 堆和栈

“堆栈”这个词总是让我迷惑,因为除了这个词,我还经常看到单独的“堆”和“栈”,今天就来梳理一下。

首先,讲讲我们的主题,Java虚拟机里的堆和栈。它俩都是虚拟机运行时数据区里的一个块区域。堆用于存储对象,是线程共享的,当虚拟机启动时就被创建了。而栈用于存储栈帧,是线程私有的,随着线程的启动而建立,结束和销毁。

这里在补充说一下虚拟机栈里存储的栈帧。每当有一个方法执行时,都会创建一个栈帧用于保存局部变量表、操作数栈、动态链接、方法出口等信息,并把栈帧压栈,并在方法退出时出栈。其中,局部变量表存储的是各种基本类型(boolean, byte, char, short, int, float, long, double),对象引用,还有returnAddress(指向一条虚拟机指令的地址)。


然后,讲讲数据结构里面的堆栈。(二叉)堆数据结构是一种数组对象,如果6-1所示,它可以被视为一颗完全二叉树。表示堆的数组A是一个具有两个属性的对象:length[A]是数组中的元素个数,heap-size[A]是存放在A中的堆的元素个数。就是说,虽然A[1...length[A]]中都可以包含有效值,但是A[heap-size[A]]之后的元素都不属于相应的堆,此处heap-size[A]小于等于length[A]。树的根为A[1],给定了某个节点的下标i,其父节点PARENT(i)、左儿子LEFT[i]和右儿子RIGHT[i]的下标可以简单地计算出来:

堆又分为大根堆和小根堆。大根堆是堆中任何节点(除根节点外)都不大于其父节点的堆,也就是说,大根堆的根节点是堆中的最大值。小根堆是堆中任何节点(除根节点外)都不小于其父节点的堆,也就是说,小根堆的根节点是堆中的最小值。

堆数完了,用一句话来说栈,栈就是一个后进先出的列表。


最后,还有进程的虚拟地址空间里的堆和栈,这里给出一篇博文的地址:

深入理解计算机系统 1.7 操作系统管理硬件

里面有相关介绍。

内容来源:

《深入理解Java虚拟机》第二版

《Java虚拟机规范 Java SE 7版》

《算法导论》第二版

你可能感兴趣的:(JAVA虚拟机,栈,堆)