JVM-栈

栈Stack

概念

1.栈(stack)栈是限制仅在表的一端(表尾)进行插入和删除运算的线性表。向栈中插入元素称为进(入)栈,从栈中删除元素称为退(出)栈。

2.栈顶(top)允许进行插入、删除操作的这一端称为栈顶,又称为表尾。由于元素的进栈和退栈,栈顶的位置经常是变动的,因此需要用一个整型量top指示栈顶的位置,通常称top为栈顶指针。

3.栈底(bottom)在栈中固定的一端称为栈底,用base表示,又称为表头。

4.空栈当栈中没有元素时称为空栈,即top==base。

5.栈的长度栈中数据元素的个数表示栈的长度。

栈与队列

队列:又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作

 

 

栈的优势:存取速度比堆快!仅次于寄存器,栈的数据是不可以共享的;

栈里面存储什么

Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。

基本类型的变量保存原始值,即:他代表的值就是数值本身。

而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

引用类型包括:类类型,接口类型和数组。

栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处)

StackOverFlow

public class Demo01 {
    public static void main(String[] args) {
        a();
    }
    // main  a  a  a   a a  a a a  a a  a  满
    // Exception in thread "main" java.lang.StackOverflowError
    private static void a() {
        a();
    }
}

栈里面是一定不会存在垃圾回收的问题的,只要线程一旦结束,该栈就Over了。生命周期和线程一致;

栈帧

当线程执行到某个方法时就会往方线程栈中压入一个帧,称为栈帧,栈帧中包含了方法的局部变量表、操作数栈、返回地址、动态连接等信息

1.局部变量表:

顾名思义就是用来存储java方法中的局部变量的,在编译期间就会分配方法局部变量表的最大容量,局部变量表以变量槽为单位,每个变量槽可以存储32位及32位以下的变量,具体大小根据变量实际占用内存而定,java的基本类型中除了long和double外其他类型都是32位以下,所以每个变量占用一个变量槽即可,而对于long和double类的变量,会占用两个变量槽,除了基本类型当然还有引用类型,引用类型变量长度JVM并没有明确定义。JVM通过索引的方式来访问变量表中的变量,索引从0开始。变量槽是可以重复使用的,当变量槽所存储的变量已经不在其作用域后,该变量槽就可以被其他变量占用

2.操作数栈:

用于在方法运行时可以存放以及获取操作数,其所需要的最大栈深度也是在编译期间定下的,在方法刚开始运行时,操作数栈是空的,在方法执行过程中会有各种操作指令往操作数栈中压入和获取内容,也就是出栈/入栈操作,比如一个加法指令对两个数据进行相加,运行到这里前会先将两个数据压入栈中,然后将这两个操作数取出相加;在实际情况中,方法的操作数栈之间并不完全独立,往往会公用部分空间,这样在方法调用时就不需要进行参数复制了 3.动态连接:

前面说了常量池中会存储方法的符号引用,而每个栈帧中都会存储一个引用,用于指向常量池中该方法对应的符号引用,字节码指令中方法的调用就以方法对应的符号引用为参数来进行,在类加载阶段的解析步骤中,部分符号引用会被解析为直接引用,称为静态解析,在方法的运行过程中,另一部分符号引用会被实时的解析为直接引用,称为动态连接。

4.被静态解析的条件:

方法在运行前就有一个可确定的调用版本,其实也就是编译期就刻意确定改方法有没有可能通过继承或者其他方式被重写,在java中静态方法(与类型直接关联),私有方法(外部不可访问),构造方法,父类方法,final方法,这五种方法的符号引用可以被静态解析都不可能被重写,可以在运行前确定唯一的调用版本,满足被静态解析的条件,称为非虚方法。

5.方法返回地址:

方法的运行过程中,可能会正常退出,也可能会异常退出,不论是哪种退出方式,在退出后都会要保证其上层调用者可以知道方法退出的位置,以便于程序继续执行,方法的返回地址就是用于确定退出位置的。

 

栈(存什么)+ 堆 + 方法区的交互图:

 

我们的这个栈主要是 HotSpot (指针)

问题:请你谈谈你认识几种 JVM? (3种)

  • SUN 公司 HotSpot (掌握即可)

  • BEA 公司 JRockit

  • IBM 公司 J9VM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值