JVM -- 运行时栈桢结构

本文深入探讨了JVM的运行时栈帧结构,包括局部变量表的slot复用、操作数栈的溢出解决方案、动态链接的原理以及方法调用的静态与动态分派。栈帧中的局部变量表在超出作用域后,其slot可以被复用并可能触发垃圾回收。操作数栈的溢出可通过调整栈深度或优化程序避免。动态链接在运行时确定直接引用地址。方法返回地址确保了方法调用的正确返回。解析调用用于确定静态、构造、私有和final方法的调用版本,而动态语言支持则允许运行时确定类型。最后,静态分配与动态分配在方法调用中的应用进行了阐述。
摘要由CSDN通过智能技术生成

运行时栈桢结构

局部变量表 – localVariableTable

局部变量表可以理解为一个数组,数组的每一个元素可以看做是一个slot

LocalVariableTable:
start length Slot Name Signature
0		11		0	args [Ljava/lang/String
5		6		1	buf  [8
7		4		2	a	 I

[ 开头的代表引用类型
[B 代表一个字节,引用类型

image.png
成员变量,加载连接–准备时候会分配空间 然后初始化时候会赋予一个默认值 可以直接返回a+b;
局部变量,没有机会赋初始值的,所以add2() 方法不能return a+b;

slot复用:
局部变量表的被分配的slot是可以被复用的,当pc寄存器的值大于slot作用域的时候,在编译阶段就可以被复用,;
image.png
buff被{}包起来了,{}以外表示超过作用域;
上面那个{} 表示超过了作用域;
buff能否被回收依据buff,局部变量的soLT是否存有对象引用;

image.png
之后要进行垃圾回收,solt复用,buff被回收

操作数栈:

Microsoft Windows [版本 10.0.17763.194]
(c) 2018 Microsoft Corporation。保留所有权利。

E:\Hepburn‘s desk>javac Demo.java

E:\Hepburn‘s desk>java Demo
a_value0

E:\Hepburn‘s desk>javap -v Demo
Classfile /E:/Hepburn‘s desk/Demo.class
  Last modified 2019-5-27; size 654 bytes
  MD5 checksum bcfd8b0f4308251a717ca9cadf8ef656
  Compiled from "Demo.java"
public class Demo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #13.#22        // java/lang/Object."<init>":()V
   #2 = Integer            31457280
   #3 = Fieldref           #23.#24        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Class              #25            // java/lang/StringBuilder
   #5 = Methodref          #4.#22         // java/lang/StringBuilder."<init>":()V
   #6 = String             #26            // a_value
   #7 = Methodref          #4.#27         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #8 = Methodref          #4.#28         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   #9 = Methodref          #4.#29         // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #10 = Methodref          #30.#31        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #11 = Methodref          #23.#32        // java/lang/System.gc:()V
  #12 = Class              #33            // Demo
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值