课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java虚拟机栈是程序员在学习java虚拟机技术的时候需要重点掌握的一个知识点,下面我们就通过案例分析来了解一下,java虚拟机栈的特点与应用方法。
Java虚拟机栈(JavaVirtualMachineStacks)也是线程私有的,它的生命周期与线程相同。
每个Java方法在执行的同时都会创建一个栈帧(StackFrame)用于存储局部变量表、操作数栈、常量池引用等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在Java虚拟机栈中入栈和出栈的过程。
虚拟机栈的特点有:
Java方法执行的内存模型
包含多个栈帧
Java虚拟机是基于「栈」架构的,栈帧(StackFrame)是用于支持虚拟机进行方法调用和方法执行的数据结构。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。
每个栈帧存储了:局部变量表、操作数栈、动态链接、方法的返回地址。
局部变量表和操作数栈
局部变量表:32位变量槽,存放了编译期可知的各种基本数据类型、对象引用、ReturnAddress类型。
操作数栈:入栈、出栈、复制、交换、产生消费变量。基于栈的执行引擎,虚拟机把操作数栈作为它的工作区,大多数指令都要从这里弹出数据、执行运算,然后把结果压回操作数栈。
动态链接:每个栈帧都包含一个指向运行时常量池(方法区的一部分)中该栈帧所属方法的引用。持有这个引用是为了支持方法调用过程中的动态连接。Class文件的常量池中有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或一次使用的时候转化为直接引用,这种转化称为静态解析。另一部分将在每一次的运行期间转化为直接应用,这部分称为动态链接。
方法出口:返回方法被调用的位置,恢复上层方法的局部变量和操作数栈,如果无返回值,则把它压入调用者的操作数栈。
注意:
递归为什么会引发java.lang.StackOverflowError异常原因:递归过深,栈帧数超出虚拟栈深度,引发Exceptioninthread"main"java.lang.StackOverflowError异常
虚拟机栈过多,无法申请到足够内存会引发java.lang.OutOfMemoryError异常
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。