Java的栈帧和动态链接是什么?

在 Java 的面试过程中,不可避免的一个面试题那就是 JVM,而 JVM 的面试题中,有各种,比如在堆中会被问到的关于垃圾回收机制的相关问题,在栈中会被问到入栈以及出栈的过程,来聊一下关于栈的相关问题,比如,栈帧和动态链接指的是什么?

JVM

JVM(Java Virtual Machine,Java虚拟机)是Java平台的核心组成部分,它是一个可以执行Java字节码的虚拟计算机。JVM的主要职责是加载Java类文件,并且根据这些类文件中的定义来执行相应的操作。

JVM(Java Virtual Machine,Java虚拟机)主要包含以下几个组成部分:

类加载器(Class Loader):负责加载字节码文件到内存,将.class文件中的类信息加载到JVM中,以便JVM能够识别和使用这些类。

运行时数据区(Runtime Data Area):JVM的核心内存空间结构模型,主要包括以下子区域:

  • 方法区(Method Area):用于存储虚拟机加载的类信息、常量、静态变量,以及即时编译器编译后的代码等数据。
  • 堆(Heap):存储Java程序创建的类实例(对象引用)。这是所有线程共享的内存区域,用于存放对象实例。
  • Java栈(JVM Stacks):每个虚拟机线程都有一个私有的栈,用于存储局部变量、方法参数以及方法调用的相关信息。每个方法执行时,都会创建一个栈帧来存储这些信息。
  • 程序计数器(Program Counter Register):一块较小的内存空间,作为当前线程所执行的字节码的行号指示器。它记录了线程执行的当前位置。
  • 本地方法栈(Native Method Stack):与Java栈非常相似,但用于支持native方法的执行。当JVM调用native方法时,会在这个栈中创建栈帧。

执行引擎(Execution Engine):对JVM指令进行解析,翻译成机器码,然后提交到操作系统中执行。它负责读取JVM指令并驱动其执行。

本地库接口(Native Interface):允许Java代码与其他语言写的代码进行交互。它提供了Java调用其他语言的原生库的能力,使得Java程序能够使用其他语言的库和函数。

本地方法库(Native Method Library):实现了Java本地方法的具体功能,这些方法是使用其他语言(如C或C++)编写的,并通过本地库接口与Java代码进行交互。

JVM中的栈帧

在Java虚拟机(JVM)中,栈帧(Stack Frame)是用于支持方法调用和执行的数据结构,是方法执行时的内存模型。每个方法从调用直至执行完成的过程,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

栈帧存储了方法的局部变量表、操作数栈、动态链接、方法出口等信息。当一个方法被调用时,一个新的栈帧就会被创建并压入到虚拟机栈中,这个栈帧中保存了方法的局部变量、实际参数、操作数栈、常量池引用等信息。当方法执行完毕后,这个栈帧就会从虚拟机栈中弹出,接着执行上一个方法栈帧中的操作。

栈帧的结构主要包括以下几个部分:

局部变量表(Local Variable Table):存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

操作数栈(Operand Stack):也称为表达式栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

动态链接(Dynamic Linking):指向运行时常量池的方法引用,使得方法中的符号引用在运行时可以直接定位到引用的目标,比如某个类的成员或者方法。

方法返回地址(Return Address):存放着调用该方法的PC寄存器的值。当一个方法执行完毕后,会依赖这个方法出口来恢复上层方法的执行。

就像上图这样,但是看图的时候,又会有人发出疑问,既然动态链接都属于栈帧了,那么为什么还会再标题上把他区分出来,就来说一下这个动态链接的问题。

栈帧当中的动态链接

动态链接是为了支持动态方法的调用过程,这句话看起来好像也没什么毛病,但是总感觉很空,对着面试官如果说这句,那肯定还有下文,所以换成能理解的方式来解读一下。

动态链接实际上就是符号引用转变为直接引用。

符号引用转为直接引用是类加载过程中的一个关键步骤,它发生在解析阶段。符号引用是编译原理中的概念,可以包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。

这些符号引用在Java字节码中以CONSTANT_Class_infoCONSTANT_Fieldref_infoCONSTANT_Methodref_info等类型的常量来表示。

而直接引用则是与内存布局相关的,比如直接指向目标代码的指针、相对偏移量或者是一个能间接定位到目标的句柄。直接引用是与虚拟机实现的内存布局紧密相关的,同一个符号引用在不同虚拟机实例上甚至在同一虚拟机实例的不同类加载过程中可能都会转换为不同的直接引用。

在类加载的解析阶段,虚拟机将常量池内的符号引用替换为直接引用的过程称为解析。解析是类加载过程中必不可少的一个环节。如果符号引用无法进行解析,那么将会抛出一个异常,比如常见的java.lang.NoClassDefFoundError或java.lang.NoSuchFieldError、java.lang.NoSuchMethodError等。

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。对于这7类符号引用,未必一定能在解析阶段或第一次使用时就完成解析,有些符号引用是在真正使用的时候才进行解析的,这种解析方式称为惰性解析。

总的来说,符号引用转为直接引用是Java类加载过程中解析阶段的一个重要步骤,它确保了符号引用能够被正确地解析为内存中的直接引用,从而实现Java程序的正常运行。

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

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

相关文章

C0008.Clion利用C++开发Qt界面,使用OpenCV时,配置OpenCV方法

安装OpenCV 配置环境 配置Clion中的CMakeLists.txt文件 # 设置OpenCV的安装路径 set(OpenCV_DIR "D:/OpenCv_Win/opencv/build/x64/vc16/lib"

分糖果C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 拿 k20 块糖放入篮子里。 篮子里现在糖果数 20≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 13≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 6<n7&#xf…

【算法竞赛】堆

堆是一种树形结构,树的根是堆顶,堆顶始终保持为所有元素的最优值。 有最大堆和最小堆,最大堆的根节点是最大值,最小堆的根节点是最小值。 本节都以最小堆为例进行讲解。 堆一般用二叉树实现,称为二叉堆。 二叉堆的典型应用有堆排序和优先队列。 二叉堆的概念 二叉堆是一棵…

定时器定时中断定时器外部中断

基础背景&#xff1a;TIM定时中断-CSDN博客 TIM的函数 // 恢复缺省设置 void TIM_DeInit(TIM_TypeDef* TIMx); // 时基单元初始化&#xff0c;第一个参数TIMx选择某个定时器&#xff0c;第二个参数是结构体&#xff0c;包含了配置时基单元的一些参数。 void TIM_TimeBaseInit…

c++ string 以 空格 拆分

在C中&#xff0c;你可以使用std::istringstream和std::getline来以空格为分隔符拆分字符串。以下是一个简单的函数&#xff0c;它将字符串拆分为单词的std::vector<std::string>。 #include <iostream> #include <sstream> #include <vector> #inclu…

blender解决缩放到某个距离就不能继续缩放

threejs中也存在同样的问题&#xff0c;原因相同&#xff0c;都是因为相机位置和相机观察点距离太近导致的。 threejs解决缩放到某个距离就不能继续缩放-CSDN博客 blender中的解决方案 1、视图中心->视图锁定->选择你想看的物体

【无标题】observer: error while loading shared libraries: libmariadb.so.3处理办法

文章目录 1.记录新装的oceanbase,使用observer帮助时&#xff0c;出现lib文件无法找到的处理过程 ./observer --help ./observer: error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or directory2.做一个strace跟踪&…

day01——登录功能

逻辑&#xff1a; 前端将登录信息通过报文的形式&#xff0c;发送给后端。后端进行登陆验证 2.1 根据接受的用户名&#xff0c;查询数据表。 若不存在该用户的记录&#xff0c;返回用户不存在。 若用户存在&#xff0c;判断数据库中的密码和接收的是否一致&#xff0c;不一致则…

OpenStack 部署实践与原理解析 - Ubuntu 22.04 部署 (DevStack)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言OpenStack 原理详解1. OpenStack 的架构2. OpenStack 的工作原理3. OpenStack 的 API4. 扩展性和模块化 OpenStack 安装方式比较1. DevStack2. Kolla3. OpenSta…

Java高效编程(7):消除过时的对象引用

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 在从手动管理内存的语言&#xff08;如C或C&#xff09;转向垃圾回收语言&#xff08;如Java&#xff09;时&#xff0c;程序员的工作变得容易得多&#xff0c;因为对象在不再使用时会被自动回收。然而…

图解C#高级教程(三):泛型

本讲用许多代码示例介绍了 C# 语言当中的泛型&#xff0c;主要包括泛型类、接口、结构、委托和方法。 文章目录 1. 为什么需要泛型&#xff1f;2. 泛型类的定义2.1 泛型类的定义2.2 使用泛型类创建变量和实例 3. 使用泛型类实现一个简单的栈3.1 类型参数的约束3.2 Where 子句3…

CI/CD详细流程

CI/CD&#xff08;持续集成/持续交付或持续部署&#xff09;是一种软件开发实践&#xff0c;旨在通过自动化软件构建、测试和部署的过程&#xff0c;提高开发效率和软件质量。以下是CI/CD流程的详细说明&#xff1a; 1. 持续集成&#xff08;CI&#xff09; 持续集成的核心思想…

安装图片标识工具anylabeling

目录 下载压缩包 创建环境 安装opencv 安装第三方库 运行setup.py文件 安装过程可能会出现的错误&#xff1a; 错误1 错误2 安装完成 图标更换 之前提到的嵌入式开发】可编程4k蓝牙摄像头点击器还可以训练模型&#xff0c;使图像识别精度提高 现在讲解&#xff0c;如…

uniapp微信小程序,获取上一页面路由

在进入当前页面的时候&#xff0c;判断是不是从某个页面跳转过来的&#xff08;一般是当前页面为公共页面是出现的&#xff09;&#xff0c;比如 A-->B C-->B ,那么 要在 C跳转到B页面的时候多个提示语什么的 而在A跳转到B时不需要&#xff0c;那么就要判断 上一页面的…

先进制造aps专题二十六 基于强化学习的人工智能ai生产排程aps模型简介

基于强化学习的人工智能ai生产排程模型简介 人工智能ai能不能做生产排程&#xff1f; 答案是肯定的。 ai的算法分两类&#xff0c;一类是学习&#xff0c;一类是搜索。 而生产排程问题&#xff0c;它是一个搜索问题&#xff0c;本质上&#xff0c;它和下围棋是一样的 我们…

行情叠加量化,占据市场先机!

A股久违的3000点&#xff0c;最近都没有更新&#xff0c;现在终于对我们的市场又来点信息。相信在座的朋友这几天都是喜笑颜开&#xff0c;对A股又充满信心。当前行情好起来了&#xff0c;很多朋友又开始重回市场&#xff0c;研究股票学习量化&#xff0c;今天我们给大家重温下…

前端规范工程-5:Git提交信息规范(commitlint + czg)

前面讲的都是在git提交之前的一些检查流程&#xff0c;然而我们git提交信息的时候&#xff0c;也应该是需要规范的。直接进入主题&#xff1a; 目录 需安装插件清单commitlint 介绍安装配置配置commit-msg钩子提交填写commit信息czg后续方式一&#xff1a;push触动build并上传…

Linux编译部署PHP环境

1.准备工作 安装前我们需要设置防护墙&#xff0c;开放端口&#xff0c;更新yum源 # 1.防火墙 systemctl status firewalld 看到active(running)就意味着防火墙打开了 systemctl stop firewalld 看到inactive(dead)就意味着防火墙关闭了 systemctl start fire…

深入理解Java中的垃圾回收机制

深入理解Java中的垃圾回收机制 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Java的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是Java语言的一大特色&#xff0c;它负责自动…

DataEase v2 开源代码 Windows 从0到1环境搭建

一、环境准备 功能名称 描述 其它 操作系统 Windows 数据库 Mysql8.0 开发环境 JDK17以上 本项基于的21版本开发 Maven 3.9版本 开发工具 idea2024.2版本 前端 VSCode TIPS&#xff1a;如果你本地有jdk8版本&#xff0c;需要切换21版本&#xff0c;请看…