
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程内存管理是每一位学习Java编程开发语言的程序员都应该熟练掌握的一个编程知识点,下面我们就通过案例分析来简单了解一下,Java编程虚拟机栈概念与应用分析。
i++反编译的文件iloal_1(从局部变量表中的1位置加载值到操作数栈栈顶),iinc11(将局部变量表中的数值加1)
这也是就为什么i++先使用后自加的愿意,改变了局部变量中的值,但是操作数栈中的值时改变之前的值
++i反编译的文件是iinc11(将局部变量表中的数值加1)后iloal_1(从局部变量表中的1位置加载值到操作数栈栈顶)
这就是为什么++i是先自己后使用的原因,先改变局部变量表中的值,后将自加的值加入到操作数栈
这也是i++++i线程不安全的原因,想象i++只做完一步,加入到了操作数栈,后被其他线程抢占,这个时候还没有写回
概念和作用:描述了java方法执行的线程内存模型,每个方法被执行的时候,java虚拟机都会同步的创建一个栈帧用于存储局部变量表,操作数栈,动态连接,方法出口等信息。每一个方法执行完毕的过程都对应一个栈帧从虚拟机栈中入栈到出栈的过程。
局部变量表(局部变量数组或本地变量表):
存放编译器可知的java虚拟机基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(reference类型,并不等同对象本身,可能是指向对象起始位置的引用指针,也可能是指向一个代表对象的句柄,或者其他与次对象相关的位置)和retrunAddress(指向一条字节码指令的地址)
1.由于局部变量是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题.
2.局部变量表中变量只在当前方法调用中有效,在方法执行中,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程.当方法随着栈帧的销毁,局部变量表也随之销毁.
slot:这些数据类型在局部变量表在和的存储空间以局部变量槽,64位的double和long的数据会占用两个变量槽,其余数据类型只会占用一个。
局部变量表所需的内部空间在编译期间完成分配,当进入一个方法,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量的大小
操作数栈:主要用于保存计算过程中的中间结果,同时作为计算过程中变量临时的存储空间。
操作数栈就是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的栈帧也会随之被创建,这个方法的操作数栈是空的。
每一个操作数栈都会拥有一个明确的栈深度用于存储数值。
如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中。
我们说是java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。
returnaddress:方法返回
正常完成出口是指方法正常完成并退出,没有抛出任何异常(包括Java虚拟机异常以及执行时通过throw语句显示抛出的异常)。如果当前方法正常完成,则根据当前方法返回的字节码指令,这时有可能会有返回值传递给方法调用者(调用它的方法),或者无返回值。具体是否有返回值以及返回值的数据类型将根据该方法返回的字节码指令确定。
异常完成出口是指方法执行过程中遇到异常,并且这个异常在方法体内部没有得到处理,导致方法退出。
1.无论方法采用何种方式退出,在方法退出后都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在当前栈帧中保存一些信息,用来帮他恢复它的上层方法执行状态。
2.方法退出过程实际上就等同于把当前栈帧出栈,因此退出可以执行的操作有:恢复上层方法的局部变量表和操作数栈,把返回值(如果有的话)压如调用者的操作数栈中,调整PC计数器的值以指向方法调用指令后的下一条指令。
动态连接
每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(DynamicLinking)。在Java源文件被编译到字节码文件时,所有的变量和方法引用都作为符号引用(SymbilicReference)保存在class文件的常量池里。
比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。
异常:线程请求的栈深度大于虚拟机允许的深度:StackOverflowError,如果java虚拟机栈容量可以动态扩展,扩展无法申请到空间是抛出OutOfMermoryError(hotspot不允许动态扩展)
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。