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

news2024/11/28 7:31:09

目录

        • 一、说明
        • 二、方法退出
        • 三、代码示例
        • 四、截图示例

一、说明
  • 1. 存放调用该方法的pc寄存器的值。
  • 2. 一个方法的结束,有两种方式:正常执行完成和出现未处理的异常的非正常退出
  • 3. 无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。
  • 4. 方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。
  • 5. 通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。
  • 6. 方法的退出就是当前栈帧出栈的过程。此时,需要恢复上层方法的局部变量表、操作数栈、将返回值压入调用者栈帧的操作数栈、设置PC寄存器值等,让调用者方法继续执行下去。
  • 7. 正常完成出口和异常完成出口的区别在于: 通过异常完成出口退出的不会给他的上层调用者产生任何的返回值。
二、方法退出
  • 1. 当一个方法开始执行后,只有两种方式可以退出这个方法
  • 2. 一是执行引擎遇到任意一个方法返回的字节码指令 (返回),会有返回值传递给上层的方法调用者,简称正常完成出口。
  • 3. 一个方法在正常调用完成之后究竟需要使用哪一个返回指令还需要根据方法返回值的实际数据类型而定。
  • 4. 在字节码指令中,返回指令包含ireturn(当返回值是boolean、byte、char、short和int类型时使用)、lreturn、freturn、dreturn以及areturn(引用类型),另外还有一个return指令供声明为void的方法、实例初始化方法、类和接口的初始化方法使用。
  • 5. 在方法执行的过程中遇到了异常 (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
    在这里插入图片描述
  • 2. 方法返回类型为char,返回指令为ireturn
    在这里插入图片描述
  • 3. 方法返回类型为int,返回指令为ireturn
    在这里插入图片描述
  • 4. 方法返回类型为long,返回指令为lreturn
    在这里插入图片描述
  • 6. 方法返回类型为float,返回指令为freturn
    在这里插入图片描述
  • 7. 方法返回类型为double,返回指令为dreturn
    在这里插入图片描述
  • 8. 方法返回类型为引用类型,返回指令为areturn
    在这里插入图片描述
  • 9. void方法,返回指令为return
    在这里插入图片描述
  • 10. init方法,返回指令为return
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【lvgl】linux开发板搭建环境

前言 本章介绍如何在linux开发板准备好了fb0的情况下移植lvgl。 抓取源码 git clone https://github.com/lvgl/lvgl.git git clone https://github.com/lvgl/lv_drivers.git git clone https://github.com/lvgl/lv_demos.git git clone https://github.com/lvgl/lv_port_lin…

【Docker】手把手教你使用Docker搭建kafka【详细教程】

目录 前提条件 1.安装Zookeeper 1.1运行ZooKeeper容器 2.运行Kafka容器 2.1启动Kafka容器 3.验证 3.1进入Kafka容器 3.2查看容器状态 3.3查看容器日志 3.4重新启动容器 3.5创建测试主题 前提条件 1. 安装Docker: 确保你已经在你的Windows机器上安装了Docker。你可以…

升级智能监控,真香!

随着社会的发展与进步,传统依赖看的监控已经无法满足大众的需求,不够智能、识别不精准,传统监控的弊端也日益显现,智能监控升级迫在眉睫。 升级智能监控,不仅能够促进公共安全,同时也能促进社会文明的发展…

Vue3多页面开发实践

前言: 项目需求,把项目中的一个路由页面单摘出来作为一个新的项目。项目部署到服务器上后,通过一个链接的形式可以直接访问到新项目的页面。 解决方式: 使用Vue多页面方式打包项目 实现步骤: 1、在项目的src目录下&am…

四、二叉树

树是常用的数据存储方式,由于树中存在大量的指针结构,所以树的有关操作相对来说是比较难的。 一、 树的定义 这里用二叉树来举例子 使用结构体的方式实现二叉树: struct BinaryTreeNode {int data;BinartTreeNode* left;BinartTreeNode* right; };使用…

柯桥俄语考级培训,俄语专八如何备考

1.用好真题 真题一共分为:口语表述、听力、词汇语法句法、文学常识、国情、阅读理解、俄汉互译、作文等部分。 第一,要自己动手做真题,然后对答案,看错题错在什么地方,还有哪些知识点是盲区。 第二,分析每…

linux下sqlplus登录oracle显示问号处理办法

问题描述 昨天紧急通过rpm按安装方式给客户装了一台linux的19c数据库,操作系统是CentOs Stream release 9,过程不再回忆了… 今天应用发现sqlplus登入后部分显示问号?,需要处理下 原因分析: 很明显,这就是…

Android ConstraintLayout分组堆叠圆角ShapeableImageView

Android ConstraintLayout分组堆叠圆角ShapeableImageView <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"…

中文大语言模型汇总

推荐一篇非常棒的github&#xff1a;Awesome-Chinese-LLM 另附语言模型排行榜&#xff1a;FastChat 里面总结了几乎所有目前主流的中文大语言模型。在此记录一下&#xff0c;方便以后慢慢学习。

Adobe Photoshop Elements 2024 v24.0 简体中文版 | 中文直装版

下载&#xff1a; http://dt1.8tupian.net/2/29913a53b500.pg3介绍&#xff1a;Photoshop Elements 2024(简称PSE即PS简化版)是一款定位在数码摄影领域的全新的图像处理软件&#xff0c;该软件包括了专业版的大多数特性&#xff0c;只有少量的简化选项&#xff0c;提供了调整颜…

高速缓存--直接映射

某高速缓存大小 256 字节&#xff0c;直接映射&#xff0c;块大小为 16 字节。定义 L 为数据装载命令&#xff0c;S 为存储&#xff0c;M 为数据修改。若每一数据装载(L)或存储(S)操作可引发最多 1次缓存缺失(miss)&#xff1b;数据修改操作(M)可认为是同一地址上 1 次装载后跟…

【3D图像分割】基于Pytorch的VNet 3D图像分割5(改写数据流篇)

在这篇文章&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2&#xff08;基础数据流篇&#xff09; 的最后&#xff0c;我们提到了&#xff1a; 在采用vent模型进行3d数据的分割训练任务中&#xff0c;输入大小是16*96*96&#xff0c;这个的裁剪是放到Dataset类…

将 UniLinks 与 Flutter 集成(安卓 AppLinks + iOS UniversalLinks)

让我们使用 Flutter Mobile 和 Flutter Web 集成 UniLinks。 一步一步的指导&#xff01; 我是 Pedro Dionsio&#xff0c;是葡萄牙 InspireIT 公司的 Flutter 开发人员&#xff0c;我写这个 UniLinks 教程的座右铭是&#xff1a; Firebase DynamicLinks 已被弃用&#xff0…

cocosCreator微信小游戏 之 分享好友和朋友圈(四)

creator版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 简介 微信小游戏的分享分为两种&#xff1a; 被动分享 通过右上角的**…**打开&#xff0c;需要手动设置显示菜单才能分享好友或朋友圈主动分享 调用指定的 wx API接口即可进行分享好友 他…

[2016-2018]phpstudy的exp制作

[2016-2018]phpstudy的exp制作 用python的requests模块进行编写 修改请求数据包进行远程代码执行 import requests import base64 def remove_code_execute():try:url input("请输入要测试的网址:")cmd input("想要执行的命令:")cmd f"system({…

开源 | 30余套STM32单片机、嵌入式Linux、物联网、人工智能项目(开发板+教程+视频)

文末免费领取&#xff01; 30余套综合项目案例 STM32单片机、嵌入式、物联网、人工智能 项目文档源码视频 高校教学、学生毕设、个人项目练手 嵌入式实战项目推荐 15个嵌入式LinuxQt综合应用项目&#xff0c;涉及家居、医疗、农业等多种应用领域&#xff0c;案例中使用了嵌…

【MATLAB源码-第66期】基于麻雀搜索算法(SSA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种新颖的元启发式优化算法&#xff0c;它受到麻雀社会行为的启发。这种算法通过模拟麻雀的食物搜索行为和逃避天敌的策略来解决优化问题。SSA通过模拟…

unity 从UI上拖出3D物体,(2D转3D)

效果展示&#xff1a; 2D转3D视频 UI结构 UI组件挂载 UI结构 这个脚本挂载到 3D物体身上 using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragGame : MonoBehaviour {[HideInInspector]public bool isDrag…

数据库存储引擎和锁

存储引擎&#xff1a; mysal当中数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制&#xff0c;索引技巧&#xff0c;锁定水平以及最终提供的不同功能和能力&#xff0c;这些就是我们说的存储引擎。 功能&#xff1a; 1、mysql将数据存储在文件系…

H5ke9

上次fetvh就一个参数url,,就是get请求 fetch还可以第二个参数对象,可以指定method:改为POST 请求头header :发送txt,servlet,json给客户端,,异步请求图片 1 这节客户端传到服务器端 2异步文件上传,两三行代码把文件传输 mouseover事件 .then()的使用 是Promise对象的一个方法…