91名师指路-头部
91名师指路

JVM系列(七):java栈

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

一:栈管运行,堆管存储。

二:队列(FIFO):是先进先出;栈(FILO):是先进后出。

三:8种基本类型,对象引用变量,实例方法都时在栈内存中分配的。

java方法就是栈帧,在java中叫方法,如main方法,将这个方法压到jvm的栈里面后,就叫栈帧。


四:栈运行原理


五:


六:栈帧的内部结构。


一个栈里面可能又一个或多个栈帧。一个方法对应一个栈帧。

每个栈帧里面有分别有:

1)局部变量表(Local Variables)。用于存放方法参数和方法内定义的局部变量。一个局部变量可以保存一个类型为boolean、byte、char、short、int、float、reference和returnAddress类型的数据。reference类型表示对一个对象实例的引用。returnAddress类型是为jsr、jsr_w和ret指令服务的,目前已经很少使用了。

2)操作数栈(Operand Stack)。为操作数分配的一块栈空间。如int a=5; 其中的5就是操作数。为5分配的一块栈空间就叫做操作数栈。

3)动态链接(Dynamic Linking)。每个栈帧都包含一个执行运行时常量池中该栈帧所属方法的引用,持有这个引用就是为了支持方法调用过程中的动态链接. 我们知道 Class 文件常量池中存在大量的符号引用,这些符号引用一部分会在类加载阶段或者第一次使用的时候就转化为直接引用,这个转化称为静态解析.另一部分将在每次运行期间转化为直接引用,这部分称为动态链接。

4)方法返回地址(Return Address)。存放调用该方法的pc寄存器的值。一个方法的结束,有两种方式:

1. 正常执行完成。2. 出现未处理的异常,非正常退出。无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。

5)一些附加信息。虚拟机规范允许具体的虚拟机实现增加一些规范中没有描述的信息到栈帧之中,例如和调试相关的信息,这部分信息完全取决于不同的虚拟机实现。在实际开发中,一般会把动态连接,方法返回地址与其他附加信息一起归为一类,称为栈帧信息。


七:代码演示 java.lang.StackOverflowError

package com.mszl.jvm;

/**
* 功能:演示java.lang.StackOverflowError
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
public class T1 {

public static void aa(){
aa();
}

public static void main(String[] args) {
System.out.println("进来了 91名师指路");
aa();
System.out.println("我们的网址 http://www.91mszl.com");
}

}

执行结果:

进来了 91名师指路
Exception in thread "main" java.lang.StackOverflowError
at com.mszl.jvm.T1.aa(T1.java:11)

aa方法循环调用aa方法导致 java.lang.StackOverflowError


备注:调整栈空间的大小采用-Xss来进行设置。


2020-03-28 09:42:19     阅读(1089)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部