【jvm】虚拟机栈之方法返回地址

目录

一、说明
    1. 存放调用该方法的pc寄存器的值。
    1. 一个方法的结束,有两种方式:正常执行完成和出现未处理的异常的非正常退出
    1. 无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。
    1. 方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。
    1. 通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。
    1. 方法的退出就是当前栈帧出栈的过程。此时,需要恢复上层方法的局部变量表、操作数栈、将返回值压入调用者栈帧的操作数栈、设置PC寄存器值等,让调用者方法继续执行下去。
    1. 正常完成出口和异常完成出口的区别在于: 通过异常完成出口退出的不会给他的上层调用者产生任何的返回值。
二、方法退出
    1. 当一个方法开始执行后,只有两种方式可以退出这个方法
    1. 一是执行引擎遇到任意一个方法返回的字节码指令 (返回),会有返回值传递给上层的方法调用者,简称正常完成出口。
    1. 一个方法在正常调用完成之后究竟需要使用哪一个返回指令还需要根据方法返回值的实际数据类型而定。
    1. 在字节码指令中,返回指令包含ireturn(当返回值是boolean、byte、char、short和int类型时使用)、lreturn、freturn、dreturn以及areturn(引用类型),另外还有一个return指令供声明为void的方法、实例初始化方法、类和接口的初始化方法使用。
    1. 在方法执行的过程中遇到了异常 (Exception),并且这个异常没有在方法内进行处理,也就是只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出。简称异常完成出口。
三、代码示例
复制代码
package com.learning.stack.return_address;

import java.util.Date;

/**
 * @Author wangyouhui
 * @Description 方法返回地址
 **/
public class ReturnAddressLearning {
    public boolean booleanMethod(){
        return false;
    }

    public char charMethod(){
        return 'a';
    }

    public int intMethod(){
        return 0;
    }

    public long longMethod(){
        return 0L;
    }

    public float floatMethod(){
        return 0.0f;
    }

    public double doubleMethod(){
        return 0.0;
    }

    public String stringMethod(){
        return null;
    }

    public Date dateMethod(){
        return null;
    }

    public void voidMethod(){
    }
}
四、截图示例
    1. 方法返回类型为boolean,返回指令为ireturn
    1. 方法返回类型为char,返回指令为ireturn
    1. 方法返回类型为int,返回指令为ireturn
    1. 方法返回类型为long,返回指令为lreturn
    1. 方法返回类型为float,返回指令为freturn
    1. 方法返回类型为double,返回指令为dreturn
    1. 方法返回类型为引用类型,返回指令为areturn
    1. void方法,返回指令为return
    1. init方法,返回指令为return
相关推荐
zy happy19 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
丈剑走天涯1 天前
JVM(八) JDK8 Parallel GC
jvm
LING-Z2 天前
JVM GC 机制详解:算法、分代、回收器、GC 类型一篇讲透
java·jvm·垃圾回收
大不点wow2 天前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm
程序员天天困2 天前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
白露与泡影2 天前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
Ai_easygo3 天前
MCP 协议实战:用 Claude Desktop 连本地 SQLite,5 分钟搭一个能查数据的 AI 助手
jvm·人工智能·sqlite
小园子的小菜4 天前
深入理解 JVM 垃圾回收:从对象判定、回收算法到经典收集器全解析
jvm·算法
孫治AllenSun4 天前
【JVM】四大引用类型分析
java·开发语言·jvm
笨笨饿5 天前
101_详解USB协议
java·jvm·数据结构