前言
上文就讲了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 方法运行对虚拟机栈的一个影响。虚拟机栈就是用来存储线程运行方法中的数据的。而每一个方法对应一个栈帧。
虚拟机桟的讲解也就到这里了,希望对大家有所帮助。