一、又名堆栈,它是一种运算受限的线性表。其限制是仅容许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把 另外一端称为栈底。其特性是先进后出。数据结构
二、栈是线程私有的,生命周期跟线程相同,当建立一个线程时,同时会建立一个栈,栈的大小和深度都是固定的。jvm
三、方法参数列表中的变量,方法体中的基本数据类型的变量和引用数据类型的引用都存放在栈中,成员变量和对象自己不存放在栈中。运行时,成员函数的局部变量引用也存放在栈中。函数
四、栈的变量随着变量做用域的结束而释放,不须要jvm垃圾回收机制回收。优化
五、栈不是全局共享的,每一个线程建立一个栈,该线程只能访问其对应的栈数据线程
六、栈内存的大小是在编译期就肯定了的。设计
一、一个栈中能够有多个栈帧,栈帧随着方法的调用而建立,随着方法的结束而消亡。该栈帧中存储该方法中的变量,原则上各个栈帧之间的数据是不能共享的,可是在方法间调用时,jvm会将一方法的返回值赋值给调用它的栈帧中。每个方法调用,就是一个压栈的过程,每一个方法的结束就是一个弹栈的过程。压栈都将会将该栈帧置于栈顶,每一个栈不会同时操做多个栈帧,只会操做栈顶,当栈顶操做结束时,会将该栈帧弹出,同时会释放该栈帧内存,其下一个栈帧将变为栈顶。栈内存归属于单个线程,每一个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存能够理解成线程的私有内存。指针
二、栈中的优化,其一是当局部变量赋值时,会在栈空间中找其对应的值,当有该值时,将该值指向变量,当没有该值时,建立一个该值,而后再指向该变量,例如:int a = 1, int b = 1, b = 2; 其二是栈中的变量随着方法的调用而建立,当方法执行结束后,jvm会自动释放内存。对象
一、局部变量表:是一组变量值的存储空间,用呀存放方法参数和局部变量,虚拟机经过索引定位的方式使用局部变量表。索引
二、操做数栈:常称为操做数栈,是一个后入先出栈。方法执行中进行算术运算或者是调用其余的方法进行参数传递的时候是经过操做数栈进行的。在概念模型中,两个栈帧是相互独立的。可是大多数虚拟机的实现都会进行优化,令两个栈帧出现一部分重叠。令下面的部分操做数栈与上面的局部变量表重叠在一块,这样在方法调用的时候能够共用一部分数据,无需进行额外的参数复制传递。生命周期
三、动态链接: 在说明什么是动态链接以前先看看方法的大概调用过程,首先在虚拟机运行的时候,运行时常量池会保存大量的符号引用,这些符号引用能够当作是每一个方法的间接引用,若是表明栈帧A的方法想调用表明栈帧B的方法,那么这个虚拟机的方法调用指令就会以B方法的符号引用做为参数,可是由于符号引用并非直接指向表明B方法的内存位置,因此在调用以前还必需要将符号引用转换为直接引用,而后经过直接引用才能够访问到真正的方法,这时候就有一点须要注意,若是符号引用是在类加载阶段或者第一次使用的时候转化为直接应用,那么这种转换成为静态解析,若是是在运行期间转换为直接引用,那么这种转换就成为动态链接。
四、方法返回地址:方法的返回分为两种状况,一种是正常退出,退出后会根据方法的定义来决定是否要传返回值给上层的调用者,一种是异常致使的方法结束,这种状况是不会传返回值给上层的调用方法.不过不管是那种方式的方法结束,在退出当前方法时都会跳转到当前方法被调用的位置,若是方法是正常退出的,则调用者的PC计数器的值就能够做为返回地址,若是是由于异常退出的,则是须要经过异常处理表来肯定.在方法的的一次调用就对应着栈帧在虚拟机栈中的一次入栈出栈操做,所以方法退出时可能作的事情包括,恢复上层方法的局部变量表以及操做数栈,若是有返回值的话,就把返回值压入到调用者栈帧的操做数栈中,还会把PC计数器的值调整为方法调用入口的下一条指令。
一、栈帧内存数据共享:栈帧之间数据不能共享,可是同一个栈帧内的数据是能够共享的,这样设计是为了减少内存消耗,例如:int a = 1, int b= 1时,前面定义了a=1,a和1都在栈内存内,若是再定义一个b=1,此时将b放入栈内存,而后查找栈内存中是否有1,若是有则b指向1。若是再给b赋值2,则在栈内存中查找是否有2,若是没有就在栈内存中放一个2,而后b指向2。也就是若是常量在栈内存中,就将变量指向该常量,若是没有就在该栈内存增长一个该常量,并将变量指向该常量。
二、存取速度比堆要快,仅次于寄存器。速度快之一是栈在编译器就申请好了内存空间,因此在运行时不须要申请内存大小,节约了时间,其二是栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。其三是访问时间,访问堆的一个具体单元,须要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。
存在栈的数据大小和生存期必须是肯定的,缺少灵活性。当栈在运行执行程序时,发现栈内存不够,不会动态的去申请内存,以致于致使程序报错,因此灵活性较差。