- 前言
- 虚拟机听细讲
- 虚拟机的构成
- 闭帧
- 1、 局部变量表
- 2.、作数词
- 3、动态连接
- 4、返回地址
- 闭帧
- 代码实例讲解
- 虚拟机的构成
虚拟机桟细讲上文就讲了JVM内存的五部分,Java方法区、Java栈、Native方法区、Java堆和程序计数器本文就详细详解下,并附带代码实例
虚拟机里存储的是当前线程运行java方法所需的数据,指令、返回地址
指令限制 –Xss桟的大小。不同的jdk版本默认的梗大小不同。
会发生栈溢出错误。
里面包含了一个个的桟帧。
栈帧:在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦方法完成相应的调用,则出栈
栈帧大体都包含四个区域:(局部变量表、操作数栈、动态连接、返回地址)
1、 局部变量表局部变量表用于存放局部变量的(方法中的变量)。是一个32为长度,用于存放java八大基础数据类型。如果是64位的可以使用高地占位两个存放。如果是局部的对象,比如Object 对象,则只需要存放一个地址引用即可。
2.、作数桟作数序是存放java方法执行的操作数的,也是一个先进后出的栈结构,操作数栈用来操作的,操作的元素可以是任意的java数据类型。所以,一个方法刚开始的时候,他的操作数栈就是空的。只有方法执行,才会对操作数栈进行操作。
3、动态连接动态链接主要就是指向运行时常量池的方法引用
4、返回地址正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)
代码实例讲解如图所示,这段代码很简单,就是一个起一个 main 方法,在 main 方法运行中调用 A 方法,A 方法中调用 B 方法,B 方法中运行 C 方法。 我们把代码跑起来,线程 1 来运行这段代码, 线程 1 跑起来,就会有一个对应 的虚拟机栈,同时在执行每个方法的时候都会打包成一个栈帧。 比如 main 开始运行,打包一个栈帧送入到虚拟机栈,同样A方法B方法也会产生桟帧存在桟中。
C 方法运行完了,C 方法出栈,接着 B 方法运行完了,B 方法出栈、接着 A 方法运行完了,A 方法出栈,最后 main 方法运行完了,main 方法这个栈帧就 出栈了。 这个就是 Java 方法运行对虚拟机栈的一个影响。虚拟机栈就是用来存储线程运行方法中的数据的。而每一个方法对应一个栈帧。
虚拟机里的讲解也就到这里了,希望对大家有所帮助。



