面试必问!JVM 不得不说的知识点(三)

在这里插入图片描述

一、 JVM指令集:

1. 了解Java虚拟机的指令集是什么?举例说明一些常见的指令及其作用。

Java虚拟机的指令集是一组用于执行Java程序的低级操作码。这些指令直接在Java虚拟机上执行,可以认为是Java程序的二进制表示形式。以下是一些常见的Java虚拟机指令及其作用的例子:

  1. iconst系列指令:

    • iconst_0, iconst_1, …, iconst_5: 将整数0到5推送到栈顶。
    • 作用:将常量整数压入栈顶。
  2. aloadastore系列指令:

    • aload_0, aload_1, …, aload_3: 将引用类型的局部变量加载到栈顶。
    • astore_0, astore_1, …, astore_3: 将栈顶引用类型的值存储到局部变量。
    • 作用:加载和存储引用类型数据。
  3. iloadistore系列指令:

    • iload_0, iload_1, …, iload_3: 将整数类型的局部变量加载到栈顶。
    • istore_0, istore_1, …, istore_3: 将栈顶整数类型的值存储到局部变量。
    • 作用:加载和存储整数类型数据。
  4. iaddisub等算术指令:

    • iadd: 将栈顶两个整数相加。
    • isub: 将栈顶两个整数相减。
    • 作用:执行整数加法和减法。
  5. gotoif系列指令:

    • goto: 无条件跳转到指定位置。
    • ifeq, ifne, iflt, ifge, ifgt, ifle: 根据栈顶整数的值进行条件跳转。
    • 作用:实现无条件和有条件的跳转。
  6. invoke系列指令:

    • invokevirtual, invokestatic, invokespecial, invokeinterface, invokedynamic: 分别用于调用实例方法、静态方法、私有方法、接口方法和动态方法。
    • 作用:执行方法调用。
  7. newnewarray指令:

    • new: 创建一个新的对象。
    • newarray: 创建一个新的基本数据类型数组。
    • 作用:创建对象和数组。
  8. putfieldgetfield指令:

    • putfield: 将栈顶的值赋给对象的实例字段。
    • getfield: 将对象的实例字段的值推送到栈顶。
    • 作用:访问对象的实例字段。

这些指令是Java虚拟机指令集中的一部分,涵盖了基本的栈操作、变量加载存储、数学运算、控制流等功能。在Java字节码中,这些指令按照字节码的格式被编码,并在Java虚拟机中执行。

二、 对象模型和内存布局:

1.描述Java对象在内存中的布局,包括对象头、实例数据和对齐等方面。

Java对象在内存中的布局主要包括对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)等三个部分。具体的布局可以因为虚拟机的不同而有所差异,以下是通用情况下的描述:

  1. 对象头(Header):

    • 对象头用于存储对象自身的运行时数据,包括哈希码、锁状态标志、垃圾回收信息等。对象头的大小在不同的虚拟机实现中可能会有所不同,通常在32位系统上占用8字节,而在64位系统上占用12字节。
    • 其中,包含:
      • Mark Word(标记字): 存储对象的哈希码、锁信息等。
      • Klass Pointer(类型指针): 指向对象的类元数据。
  2. 实例数据(Instance Data):

    • 实例数据部分包含了对象的字段,即在类中声明的各种成员变量。字段的大小和对齐方式由字段的类型和虚拟机的要求决定。
    • 实例数据的布局是按照在类中声明的顺序排列的,不同的虚拟机可能对字段的排列进行一些优化。
  3. 对齐填充(Padding):

    • 由于虚拟机要求对象的起始地址必须是8字节的整数倍(在某些平台上可能是4字节的整数倍),因此可能需要对实例数据进行对齐填充,以保证整个对象的大小是8字节的倍数(或4字节的倍数)。
    • 对齐填充的大小取决于实例数据部分的大小,以确保整个对象的总大小满足对齐要求。

下面是一个简单的示意图,表示一个Java对象在内存中的布局:

------------------
|  对象头(Header) |
------------------
| 实例数据(Instance Data)|
------------------
|  对齐填充(Padding)  |
------------------

在不同的虚拟机和不同的场景下,对象的布局可能会有一些变化,但以上描述是一般情况下的Java对象在内存中的典型布局。要注意,具体的实现可能因为虚拟机的版本、配置和运行时环境的不同而有所调整。

2. 什么是对象的标记字(Mark Word)?

对象的标记字(Mark Word)是Java对象头中的一部分,用于存储对象的运行时信息。在Java虚拟机的内存模型中,每个对象都有一个对象头,其中的标记字包含了对象的一些元信息,如锁信息、垃圾回收状态等。

标记字的具体结构和含义可能会因虚拟机的实现而有所不同,但通常包含以下信息:

  1. 哈希码(HashCode):

    • 用于支持hashCode()方法。在对象被创建时,如果没有重写hashCode()方法,标记字中的哈希码将默认由对象的地址计算得到。
  2. 锁信息(Lock Information):

    • 用于支持对象的同步机制。在多线程环境中,Java对象可能会被多个线程同时访问,因此需要进行加锁以确保数据的一致性。标记字中的锁信息包括了对象的锁状态、锁持有的线程等信息。
  3. 垃圾回收信息:

    • 用于支持垃圾回收。标记字中的垃圾回收信息包括了对象的存活状态、分代信息等。这些信息有助于垃圾回收器判断对象是否可被回收。
  4. 偏向锁标志(Biased Lock Flag):

    • 用于标识对象是否处于偏向锁状态。在Java虚拟机中,偏向锁是一种提高同步性能的机制。当对象被某个线程锁定时,可以使用偏向锁来减少获取锁的开销。

标记字的具体位数和结构可能因虚拟机的不同而异。在64位虚拟机中,通常使用64位来存储标记字。在32位虚拟机中,标记字的大小可能是32位。

对象的标记字是Java虚拟机管理对象的关键信息之一,它在支持同步、垃圾回收等方面发挥着重要的作用。标记字的设计可以根据不同的虚拟机实现和需求有所差异。

三、 栈和本地方法栈:

1. 解释栈的结构,栈帧的组成,以及方法调用时栈的变化。

栈(Stack)是Java虚拟机用来执行方法调用的数据结构,每个线程都有自己的栈。栈是一个后进先出(LIFO)的数据结构,用于存储方法的局部变量、操作数栈、动态链接、方法出口等信息。在Java虚拟机中,栈的结构主要由栈帧构成。

栈帧(Stack Frame)的组成:

栈帧是用于支持方法调用和执行的数据结构,每个方法调用都会创建一个对应的栈帧。栈帧的组成通常包括以下几个部分:

  1. 局部变量表(Local Variable Table):

    • 用于存储方法中的局部变量,包括方法参数和在方法体内部定义的局部变量。局部变量表中的槽位可以存放基本数据类型和对象引用。
  2. 操作数栈(Operand Stack):

    • 用于存储方法执行过程中的操作数。在方法调用时,参数从局部变量表传递到操作数栈,方法执行时,操作数栈用于存储临时数据和中间结果。
  3. 动态链接(Dynamic Linking):

    • 指向运行时常量池的方法引用,包括类和方法的信息。动态链接支持方法调用时的动态绑定。
  4. 方法返回地址(Return Address):

    • 指向方法调用结束后需要返回的地址。在Java虚拟机中,方法的返回地址通常是指向方法调用指令的下一条指令。
  5. 帧数据(Frame Data):

    • 用于存储一些附加的信息,例如异常处理表(Exception Table)等。

方法调用时栈的变化:

  1. 方法调用过程:

    • 当一个方法被调用时,Java虚拟机会创建一个新的栈帧并推入栈顶,该栈帧包含了方法的局部变量表、操作数栈等信息。
    • 方法参数被传递到局部变量表中,方法的操作数栈被清空。
  2. 方法执行过程:

    • 在方法执行过程中,局部变量表和操作数栈用于存储和计算方法中的数据。
    • 操作数栈用于存放中间结果、方法调用的参数和返回值。
  3. 方法返回过程:

    • 当方法执行完成时,返回地址和方法的返回值等信息从栈帧中弹出,控制权返回给调用方法。
    • 调用方法的栈帧被弹出,控制权回到调用方法的栈帧。
  4. 递归调用:

    • 在递归调用中,每次方法调用都会创建一个新的栈帧,形成一个栈帧的链条。这些栈帧在栈中依次排列,每个栈帧负责一个方法的执行。

栈的结构和栈帧的组成是支持Java方法调用和执行的关键。在方法调用过程中,栈帧的入栈和出栈使得方法的执行能够进行,同时局部变量表和操作数栈的使用保证了方法执行时的数据存储和计算。

2. 本地方法栈和虚拟机栈有何异同?

本地方法栈(Native Method Stack)和虚拟机栈(Java Virtual Machine Stack)都是Java虚拟机在运行时使用的栈结构,但它们分别用于支持不同类型的方法调用。

本地方法栈(Native Method Stack):

  1. 作用:

    • 本地方法栈用于支持Java虚拟机使用本地方法(Native Method),即用其他语言(通常是C或C++)编写的方法。
  2. 存储内容:

    • 存储的是本地方法的调用和执行信息。本地方法是通过Java Native Interface(JNI)调用的,其实现是由其他语言编写的。
  3. 内存管理:

    • 本地方法栈与虚拟机栈的管理方式相似,都是通过栈帧来管理方法调用的信息。但本地方法栈的管理通常由本地方法库负责,而不是由Java虚拟机直接管理。
  4. 可能性:

    • 并非所有的Java虚拟机实现都提供本地方法栈,某些虚拟机将本地方法栈和虚拟机栈合二为一。

虚拟机栈(Java Virtual Machine Stack):

  1. 作用:

    • 虚拟机栈用于支持Java方法的调用和执行。
  2. 存储内容:

    • 存储的是Java方法的调用和执行信息,包括局部变量表、操作数栈、动态链接等。
  3. 内存管理:

    • 虚拟机栈由Java虚拟机直接进行管理,它的栈帧中包含了方法的执行信息,并且可以在方法调用时动态地分配和释放栈帧。
  4. 异常处理:

    • 虚拟机栈中还包含了用于异常处理的信息,当方法出现异常时,虚拟机会在虚拟机栈中找到对应的异常处理器进行处理。

异同点总结:

  1. 调用对象:

    • 本地方法栈用于调用本地方法,而虚拟机栈用于调用Java方法。
  2. 存储内容:

    • 本地方法栈存储本地方法的调用和执行信息,虚拟机栈存储Java方法的调用和执行信息。
  3. 内存管理:

    • 本地方法栈的内存管理通常由本地方法库负责,虚拟机栈由Java虚拟机直接进行管理。
  4. 异常处理:

    • 虚拟机栈中包含了用于异常处理的信息,而本地方法栈可能不包含这样的信息。

本地方法栈和虚拟机栈都是为了支持方法调用和执行而设计的,但它们服务于不同类型的方法,具有不同的内存管理机制。

四、 深入分析类加载机制:

1.类加载过程中,具体每个阶段发生了什么?

类加载是Java虚拟机将类的二进制数据加载到内存中,并转换为可以被虚拟机直接使用的数据结构的过程。类加载过程主要包括以下阶段:

  1. 加载(Loading)阶段:

    • 加载阶段是类加载的第一阶段。在加载阶段,虚拟机需要完成以下任务:
      • 通过类的全限定名获取类的二进制数据流。
      • 将二进制数据流转换成方法区的数据结构。
      • 在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  2. 连接(Linking)阶段:

    • 连接阶段包括三个子阶段:验证、准备和解析。
      • 验证(Verification): 确保加载的类是符合Java虚拟机规范的,不会对虚拟机造成危害。
      • 准备(Preparation): 为类的静态变量分配内存并设置默认初始值,这些变量所使用的内存都在方法区中分配。
      • 解析(Resolution): 将符号引用解析为直接引用。符号引用是一组符号来描述被引用的目标,直接引用可以是直接指向目标的指针、相对偏移量或一个能间接定位到目标的句柄。
  3. 初始化(Initialization)阶段:

    • 在初始化阶段,虚拟机执行类的初始化语句。这是类加载过程的最后一步,它包括:
      • 执行类的初始化方法(<clinit>),该方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块(static {})中的语句合并产生的。
      • 如果一个类在初始化时发现它的父类还没有被初始化,则需要先触发其父类的初始化。

需要注意的是,不是所有类的加载阶段都经历完整的连接和初始化。比如,接口中定义的变量默认是public static final的,它们在接口的连接阶段就会被初始化为常量值,并不需要等到初始化阶段。而类变量则会在初始化阶段才被赋值。

2、如果要实现一个自定义类加载器,你会怎么做?

实现自定义类加载器通常需要继承ClassLoader类,并重写其中的findClass方法。以下是实现自定义类加载器的一般步骤:

  1. 继承ClassLoader类:

    • 创建一个新的类,继承自ClassLoader
    public class CustomClassLoader extends ClassLoader {// 实现自定义类加载器的方法
    }
    
  2. 重写findClass方法:

    • 在自定义类加载器中,需要重写findClass方法。这个方法负责加载类的二进制字节码并转换为Class对象。
    @Override
    protected Class<?> findClass(String className) throws ClassNotFoundException {// 实现加载类的逻辑,将二进制数据转换为Class对象byte[] classData = loadClassData(className);if (classData == null<

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

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

相关文章

供水管网监测远程管理解决方案

供水管网监测远程管理解决方案 供水管网作为城市基础设施的重要组成部分&#xff0c;其运行状况直接影响到居民的饮用水安全和城市的水资源利用。然而&#xff0c;传统供水管网管理存在管理效率低、漏损率高、故障排查困难等问题。随着物联网技术的不断发展&#xff0c;利用物…

桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、实例详解五、优缺点分析总结&#xff1a; 一、引言 ​ 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构&…

io进程线程第七天

1.使用消息队列完成两个进程之间的通信 程序A代码&#xff1a; #include <myhead.h> struct msgbuf {long mtype;char mtext[1024]; }; //定义一个宏&#xff0c;表示消息正文内容的大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const c…

目标检测-Transformer-ViT和DETR

文章目录 前言一、ViT应用和结论结构及创新点 二、DETR应用和结论结构及创新点 总结 前言 随着Transformer爆火以来&#xff0c;NLP领域迎来了大模型时代&#xff0c;成为AI目前最先进和火爆的领域&#xff0c;介于Transformer的先进性&#xff0c;基于Transformer架构的CV模型…

Devvortex

目标靶机 攻击机IP地址为10.10.16.2 信息收集 # nmap -sT --min-rate 10000 -p- 10.10.11.242 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-21 10:32 CST Warning: 10.10.11.242 giving up on port because retransmission cap hit (10). Nma…

第三方支付机构最新“POS”机刷卡费用公式

多家支付机构发布了最新的刷卡费用公示。 《非银行支付机构监督管理条例》(简称《条例》)由国务院发布&#xff0c;明确规定非银行支付机构须按照相关价格法律、行政法规的规定&#xff0c;合理确定并公开支付业务的收费项目和收费标准&#xff0c;以明码标价。 支付行业在春节…

Shell的运行原理以及Linux当中的权限问题

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Liunx从入门到精通 &#x1f69a;代码仓库&#xff1a;小…

k8s(2)

目录 一.二进制部署k8s 常见的K8S安装部署方式&#xff1a; k8s部署 二进制与高可用的区别 二.部署k8s 初始化操作&#xff1a; 每台node安装docker&#xff1a; 在 master01 节点上操作; 准备cfssl证书生成工具:&#xff1a; 执行脚本文件&#xff1a; 拉入etcd压缩包…

国产大模型,不会开启“烧钱游戏”

最近&#xff0c;OpenAI的Sora又在科技圈投入一枚深水炸弹。全球对于大模型的关注&#xff0c;又一次达到高峰。 聚焦到国内&#xff0c;百度、科大讯飞、商汤、华为等大型企业&#xff0c;以及海量的创业小公司都在布局大模型。以往每一次风口吹来的时候&#xff0c;资本总会…

springboot网站开发02-接入持久层框架mybatisPlus

springboot网站开发02-接入持久层框架mybatisPlus&#xff01;经过上一小节内容分享&#xff0c;我们的项目嵌套模式框架搭建好了&#xff0c;下面就是开始编辑具体的业务代码了&#xff0c;我们使用到了持久层框架是mybatisPlus插件。下面是一些具体的植入框架的操作步骤。 第…

C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

运行环境Visual Studio 2022 c# cad2016 cass10 根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层 一、主要步骤 zdimport 方法&#xff1a;这个方法用于导入宗地信息。首先通过调用 AutoCAD API 获取当前活动文档、数据库和编辑器对象。然后根据 CreatePalette.Se…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

day11_内部类代码块枚举课后练习 - 参考答案

文章目录 day11_课后练习代码阅读题第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题 代码编程题第13题 day11_课后练习 代码阅读题 第1题 知识点&#xff1a;实例初始化 案例&#xff1a;判断运行结果 package com.atguigu.test01;class HelloA{public …

稳定运行矿山鸿蒙系统——飞凌嵌入式的这2款核心板获得「矿鸿资质证书」

飞凌嵌入式FETMX6ULL-S核心板和FETA40i-C核心板近期通过了“矿鸿兼容性测试认证”&#xff0c;这两款嵌入式核心板与矿鸿OS的结合将进一步推动煤矿行业的智能化进程。 矿鸿&#xff08;MineHarmony&#xff09;操作系统是由国家能源集团基于鸿蒙系统推出的一款专为煤矿行业设计…

网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)

这个错误通常表现为"403 Forbidden"或"HTTP Status 403"&#xff0c;它指的是访问资源被服务器理解但拒绝授权。换句话说&#xff0c;服务器可以理解你请求看到的页面&#xff0c;但它拒绝给你权限。 也就是说很可能测试给定的参数有问题&#xff0c;后端…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

小说阅读软件书架界面和历史记录界面

1、引言 终于修改到书架界面和历史阅读记录界面了&#xff0c;修改完这两个界面就算完成一大半了&#xff0c;这两个界面其实都差不多&#xff0c;代码逻辑都一样&#xff0c;因此后面也会只展示书架界面的代码&#xff0c;历史阅读记录界面就展示效果图就行了。 2、实现代码 …

无线听觉新体验:南卡、韶音、墨觉骨传导耳机综合评测

作为一个资深的跑步爱好者&#xff0c;我几乎离不开音乐的陪伴。不知道大家有没有同感&#xff0c;有时候一首歌曲就是我坚持下去的动力&#xff0c;尤其是在那段艰难的跑步时刻。但是找到一款既能让我在运动中自由呼吸、又能提供优质音乐体验的耳机&#xff0c;并不是一件容易…

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV&#xff08;Unique Visitor&#xff09;独立访客PV&#xff08;Page View&#xff09;页面浏览量DAU&#xff08;Daily Active User&#xff09;日活跃用户量MAU&#xff08;Monthly Activ…

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样&#xff08;upsampling&#xff09;2、…