【JVM】总结篇-字节码篇

news2025/1/6 20:36:09

字节码篇

Java虚拟机的生命周期
JVM的组成
Java虚拟机的体系结构
什么是Java虚拟机

虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。

常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)

在这里插入图片描述

在这里插入图片描述

class文件结构概述

在这里插入图片描述
在这里插入图片描述

知道字节码吗?字节码都有哪些?

1. 加载和存储指令(Load and Store Instructions)
这些指令用于从操作数栈或者局部变量表加载数据,或者将数据存储到局部变量表中。

加载指令:将局部变量表中的数据加载到操作数栈。

iload, aload, fload, dload, lload:将局部变量表中的基本类型(如 int、Object 等)加载到操作数栈。
iload_<index>, aload_<index>, fload_<index> 等:将局部变量表的某个索引处的数据加载到栈中(如 iload_0 加载局部变量表中索引为 0 的 int 类型数据)。
存储指令:将操作数栈中的数据存储到局部变量表中。

istore, astore, fstore, dstore, lstore:将栈顶的数据存储到局部变量表中。
istore_<index>, astore_<index>, fstore_<index> 等:将操作数栈的值存储到局部变量表的某个索引。

2. 运算指令(Arithmetic and Logical Instructions)
这些指令执行基本的数学运算或逻辑运算。

算术运算:

iadd, isub, imul, idiv, irem:对 int 类型数据进行加法、减法、乘法、除法和取余。
fadd, fsub, fmul, fdiv, frem:对 float 类型数据进行相应的运算。
dadd, dsub, dmul, ddiv, drem:对 double 类型数据进行运算。
ladd, lsub, lmul, ldiv, lrem:对 long 类型数据进行运算。
逻辑运算:

iand, ior, ixor:对 int 类型数据执行按位与、或、异或操作。
land, lor, lxor:对 long 类型数据执行按位与、或、异或操作。

3. 控制流指令(Control Flow Instructions)
这些指令用于改变程序的执行流程,包括条件跳转、循环控制等。

条件跳转指令:

ifeq, ifne, iflt, ifge, ifgt, ifle:根据栈顶数据进行条件判断(例如:如果 int 值等于 0,则跳转)。
if_icmpeq, if_icmpne, if_icmplt, if_icmpge, if_icmpgt, if_icmple:比较栈顶的两个 int 类型的值,根据比较结果跳转。
无条件跳转:

goto:无条件跳转到指定的字节码地址。
jsr, ret:用于子程序调用和返回(jsr 和 ret 已经被标记为废弃,不再常用)。
返回指令:

return:从当前方法返回。
ireturn, lreturn, freturn, dreturn, areturn:返回不同类型的方法的结果。

4. 对象操作指令(Object Manipulation Instructions)
这些指令用于对象的创建、字段访问、方法调用等操作。

对象创建:

new:创建一个新的对象(例如 new 操作符)。
newarray, anewarray, multianewarray:创建不同类型的数组。
字段操作:

getstatic, putstatic: 获取或设置类的静态字段。
getfield, putfield: 获取或设置实例字段。
方法调用:

invokevirtual, invokespecial, invokestatic, invokeinterface:调用实例方法、构造方法、静态方法或接口方法。
对象方法和字段:

instanceof:检查对象是否是某个类型的实例。
checkcast:强制类型转换。

5. 堆栈操作指令(Stack Manipulation Instructions)
这些指令用于操作操作数栈上的数据。

操作数栈数据压栈和弹栈:
pop, pop2: 弹出操作数栈顶的数据。
dup, dup2: 复制栈顶的元素。
swap: 交换操作数栈的前两个元素。

6. 类型转换指令(Type Conversion Instructions)
这些指令用于不同类型之间的转换。

类型转换:
i2b, i2c, i2s:将 int 类型转换为 byte、char、short。
l2i, f2i, d2i:将 long、float、double 转换为 int 类型。
f2l, d2l:将 float 和 double 转换为 long 类型。
f2d, i2d, l2d:将 float、int 和 long 转换为 double 类型。

7. 异常处理指令(Exception Handling Instructions)
这些指令用于异常处理的控制流。

异常跳转:

athrow:抛出异常。
异常表:

try, catch, finally 结构通过在字节码中记录异常处理表实现。

8. 常量池指令(Constant Pool Instructions)
这些指令用于访问常量池中的常量。

常量池操作:
ldc, ldc_w, ldc2_w:将常量池中的常量加载到栈中。

9. 其他指令
这些指令提供了对 Java 字节码虚拟机执行的低级控制。

监视器指令:
monitorenter, monitorexit:用于实现同步(锁定和释放锁)。

Java虚拟机中,数据类型可以分为哪几类?

在这里插入图片描述

int a = 1;JVM如何取得a的值
Integer x = 5;int y = 5;比较 x == y 都经过哪些步骤?

  1. 源代码:
Integer x = 5;
int y = 5;
boolean result = (x == y); // 这里比较 Integer 和 int
  1. Java 类型和自动拆箱:
    x 是一个 Integer 类型对象,而 y 是一个原始的 int 类型。
    在 x == y 的比较中,x 是一个对象,y 是一个基本类型(int)。Java 会进行 自动拆箱,将 Integer 对象 x 拆箱成 int 类型,然后进行基本类型的比较。
    自动拆箱的过程是通过 Integer 的 intValue() 方法完成的,因此 x.intValue() 会将 Integer 对象 x 中的值提取为 int 类型,然后与 y 进行比较。

  2. 编译后的字节码:
    假设这段代码已经被编译成字节码,我们可以查看相应的字节码操作。

字节码指令(假设以下字节码来自于 x == y 比较的实现):

0: iconst_5             // 将字面量 5 压入操作数栈
1: invokestatic #2      // 调用 Integer.valueOf(5),返回 Integer 对象,压入操作数栈
4: astore_1             // 将 Integer 对象存储到局部变量表的索引 1(x)
5: iconst_5             // 将字面量 5 压入操作数栈
6: istore_2             // 将 5 存储到局部变量表的索引 2(y)
7: aload_1              // 将 x(Integer 对象)加载到操作数栈
8: invokevirtual #3      // 调用 Integer.intValue() 获取 x 的 int 值
11: iload_2             // 加载局部变量 y(基本类型 int)
12: if_icmpeq 17         // 比较两个 int 值是否相等,如果相等跳转到 17
15: iconst_0             // 压入 0(表示 false)
16: goto 18              // 跳转到 18 处
17: iconst_1             // 压入 1(表示 true)
18: istore_3             // 将比较结果存储到局部变量表的索引 3(result)
  1. 字节码分析:
    iconst_5:将字面量 5 压入操作数栈。这是因为 x = 5 和 y = 5 都是常量 5。
    invokestatic #2:调用 Integer.valueOf(5),将常量 5 转换成 Integer 对象,并将 Integer 对象压入操作数栈。
    astore_1:将 Integer 对象(即 x)存储到局部变量表的索引 1 位置。
    istore_2:将常量 5 存储到局部变量表的索引 2 位置,即 y。
    aload_1:将 x(Integer 对象)从局部变量表加载到操作数栈。
    invokevirtual #3:调用 Integer.intValue() 方法,将 Integer 对象 x 拆箱成基本类型 int,并将拆箱后的值压入操作数栈。
    iload_2:将 y(基本类型 int)从局部变量表加载到操作数栈。
    if_icmpeq 17:比较栈顶的两个 int 值是否相等。如果相等,跳转到 17,即跳过 iconst_0,表示比较结果为 true。
    iconst_0:如果 x.intValue() 和 y 不相等,压入 0,表示 false。
    goto 18:跳转到字节码指令 18,表示结束。
    iconst_1:如果 x.intValue() 和 y 相等,压入 1,表示 true。
    istore_3:将比较结果存储到局部变量表的索引 3(result)。
  2. 拆箱过程:
    拆箱是 Java 中的自动过程,在 x == y 比较中,x 是 Integer 类型,y 是 int 类型。JVM 会自动调用 Integer 对象的 intValue() 方法,提取 Integer 中的 int 值,然后将其与 y 进行比较。
    x.intValue() 等价于 x 的 int 值(即 5)。
    x == y 等价于 x.intValue() == y,即 5 == 5。
  3. 结果:
    如果 x 和 y 的值相等,x.intValue() == y 会返回 true,字节码会执行 iconst_1,最终将 true 存储在 result 中。
    如果 x 和 y 的值不相等,字节码会执行 iconst_0,最终将 false 存储在 result 中。
  4. 总结:
    在字节码层面,Integer 对象会通过 intValue() 方法拆箱为 int,然后与 int 类型的变量 y 进行比较。
    字节码通过 invokevirtual 调用 Integer.intValue() 方法来实现拆箱。
    比较操作会根据值的相等性进行跳转,最终将比较结果(true 或 false)存储到局部变量表中。
    JVM 处理这类操作时,通过类型转换和方法调用来确保正确的类型比较和结果。

1.包装类的缓存
FLoat Double 无

2.复习intern()字符串 (常量池位置的迁移jdk版本)
String s=new String(“a”);
s.intern();
String s2=“a”;
System.out.println(s == s2);//false
String s3=new String(“a”)+new String(“a”);
s3.intern();
String s4=“aa”;
System.out.println(s3 == s4);;//true

3.String s=new String(“a”);几个对象? 2

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

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

相关文章

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题&#xff0c;以及解决方案&#xff0c;原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览&#xff1a; …

音频进阶学习九——离散时间傅里叶变换DTFT

文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1&#xff09; 复指数 e − j ω n e^{-j\omega n} e−jωn2&#xff09;序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3&#xff09;复指数序列求和 3.DTF…

【Leecode】Leecode刷题之路第99天之恢复二叉搜索树

题目出处 99-恢复二叉搜索树-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 99-恢复二叉搜索树-官方解法 方法1&#xff1a;显式中序遍历 思路&#xff1a; 代码示例&#xff1a;&…

利用AI优化SEO提升关键词排名的有效策略

内容概要 随着数字化时代的到来&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;在各类企业的在线营销战略中占据了越来越重要的位置。而人工智能&#xff08;AI&#xff09;技术的迅速发展为SEO带来了新的机遇和挑战。通过智能化的数据分析和智能内容生成&#xff0c;企…

YOLO分割数据集转化(json转TXT)

一、数据集转化 import json import os from tqdm import tqdm import glob import os.path as ospdef json_to_txt(jsonfilePath, resultDirPath):"""jsonfilePath: labelme标注好的*.json文件所在文件夹resultDirPath: 转换好后的*.txt保存文件夹""…

中建海龙:科技助力福城南产业片区绿色建筑发展

在快速发展的城市化进程中&#xff0c;绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;凭借其卓越的科技实力和创新举措&#xff0c;在推动绿色建筑发展方面做出了…

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

python修改ppt中的文字部分及插入图片

批量修改ppt中的某个模块&#xff0c;或者批量制作奖状等场景会用到&#xff1b; import os import pandas as pd from pptx import Presentation from pptx.util import Inchesfilepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/批量制作/file1时段预警_副本.pp…

数据库新建用户后(Host:%),报错:localhost无法连接

存在问题 在给数据库&#xff08;MySQL、MariaDB等&#xff09;创建了新的用户名&#xff08;eg&#xff1a;maxscale&#xff09;后&#xff0c;无法使用新用户名登录&#xff0c;并报如下错误&#xff1a;ERROR 1045 (28000): Access denied for user maxscalelocalhost (us…

《机器学习》——逻辑回归(下采样)

文章目录 什么是下采样&#xff1f;为什么在逻辑回归中要使用下采样&#xff1f;使用下采样和不使用下采样的区别实例1、实例内容2、实例步骤 什么是下采样&#xff1f; 下采样&#xff08;Down - Sampling&#xff09;是一种数据处理技术&#xff0c;主要用于处理数据集中不同…

ACM算法模板

ACM算法模板 起手式基础算法前缀和与差分二分查找三分查找求极值分治法&#xff1a;归并排序 动态规划基本线性 d p dp dp最长上升子序列I O ( n 2 ) O(n ^ 2) O(n2)最长上升子序列II O ( n l o g n ) O(nlogn) O(nlogn) 贪心二分最长公共子序列 背包背包求组合种类背包求排列…

Scala_【5】函数式编程

第五章 函数式编程函数和方法的区别函数声明函数参数可变参数参数默认值 函数至简原则匿名函数高阶函数函数作为值传递函数作为参数传递函数作为返回值 函数闭包&柯里化函数递归控制抽象惰性函数友情链接 函数式编程 面向对象编程 解决问题时&#xff0c;分解对象&#xff…

CSS 学习之正确看待 CSS 世界里的 margin 合并

一、什么是 margin 合并 块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距&#xff0c;这样的现象称为“margin 合并”。从此定义上&#xff0c;我们可以捕获两点重要的信息。 块级元素&#xff0c;但不包括浮动和绝对定位元素&#xff0c;尽…

Golang的代码质量分析工具

Golang的代码质量分析工具 一、介绍 作为一种高效、简洁、可靠的编程语言&#xff0c;被越来越多的开发者所喜爱和采用。而随着项目规模的增长和团队人员的扩大&#xff0c;代码质量的管理变得尤为重要。为了保障代码的可维护性、健壮性和可扩展性&#xff0c;我们需要借助代码…

鸿蒙元服务 口袋管家(从0到1) ——准备工作

达到的效果图 如何创建元服务&#xff1f; 如下&#xff1a; 鸿蒙如何创建元服务-元服务是什么&#xff1f;和App的关系&#xff1f;&#xff08;保姆级步骤&#xff09;_鸿蒙元服务-CSDN博客 开始创建包 Bill 里面创建两个page页面 分别是 BillAddPage 和 BillIndexPag…

轻量型web组态软件

体验地址&#xff1a;http://www.hcy-soft.com 随着互联网、物联网技术的快速发展&#xff0c;BY组态基于多年研发积累和私有部署实践打磨、以及对业务场景的深入理解&#xff0c;推出了适用于物联网应用场景的轻量型web组态软件。 该产品采用 B/S 架构&#xff0c;提供 web …

Linux C/C++编程-获得套接字地址、主机名称和主机信息

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

SweetAlert2 - 漂亮可定制的 JavaScript 弹窗

https://sweetalert2.github.io/ https://github.com/sweetalert2/sweetalert2 安装&#xff1a; npm install sweetalert2封装&#xff1a; import Swal from sweetalert2/dist/sweetalert2.js import sweetalert2/src/sweetalert2.scss/*** * param {string} icon - ico…

Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin

Android布局layout的draw简洁clipPath实现圆角矩形布局&#xff0c;Kotlin 通常&#xff0c;如果要把一个相对布局&#xff0c;FrameLayout&#xff0c;或者线性布局等这样的布局变成具有圆角或者圆形的布局&#xff0c;需要增加一个style&#xff0c;给它设置圆角&#xff0c;…