JVM的组成、字节码文件的组成

news2024/12/23 5:52:45

目录

java虚拟机的组成

字节码文件的组成

基础信息

常量池

字段

方法

属性

字节码相关的常用工具:

总结:

1、如何查看字节码文件?

2、字节码文件的核心组成有哪些?


java虚拟机的组成

  1. 类加载器 ClassLoader
  2. 运行时数据区域(JVM管理的内存)
  3. 执行引擎(即时编译器、解释器 垃圾回收器等)
  4. 本地接口

字节码文件的组成

使用Jclasslib进行查看

  1. 基础信息
  2. 常量池
  3. 字段
  4. 方法
  5. 属性

基础信息

魔数,字节码文件对应的java版本号访问标识(public final等等)父类和接口

魔数:

  • 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。
  • 软件使用文件的头几个字节(文件头)去效验文件的类型,如果软件不支持该种类型就会出错。
  • Java字节码文件中,将文件头称为magic魔数:cafebabe

主副版本号:

  • 主副版本号指的是编译字节码文件的JDK版本号 (副版本号是当主版本号相同时作为区分不同版本的标识,一般只需要关心主版本号)
  • 版本号的作用主要是判断当前字节码的版本和运行时的JDK是否兼容
  • 下面的这个例子解释版本为6的java运行了java8中的内容了

解决方案:

1、升级JDK版本

2、将第三方以来的版本号降低或者更换依赖,以满足JDK版本的要求

我们一般会采用第二种方式,因为在项目中JDK的版本的更换可能会产生更多的版本冲突问题。

常量池

保存了字符串常量、类或接口名、字段名主要在字节码指令中使用

  • 字节码文件中常量池的作用:避免相同的内容重复定义,节省空间。
  • 常量池中的数据都有一个编号,编号从1开始。在字段或者字节码指令中通过编号可以快速找到对应的数据。
  • 字节码指令中通过编号引用到常量池的过程称之为 符号引用

字段

当前类或者接口声名的字段信息

方法

当前类或接口声名的方法信息字节码指令

案例1:

j的最终结果是1

案例2:

i的最终结果是0

案例3:

i的最终结果是1

i++ 和 ++i 在字节码的流程解读中的具体的操作顺序是有变化的

指令解读:

iconst_0

向操作数栈中添加0

istore_1

将操作数栈中的数出栈放在局部变量表数组下标为1的地方

iload_1

将局部变量表中下标为1的数据复制一份到操作数栈中

iinc 1 by 1

将局部变量表中的数据进行自增操作

案例2

回答:答案是0,我通过分析字节码指令发现,i++先把0取出来放入临时的操作数栈中,接下来对i进行+1,i变成了1,最后再将之前保存的临时之0放入i,最后i就变成了0。

属性

类的属性、比如源码的文件名 内部类列表等

字节码相关的常用工具:

javap 、jclasslib插件、阿里arthas,使用工具查看字节码文件中的详细信息

阿里arthas:宝藏工具 (阿尔萨斯)

监控线上运行中的系统,并且能够发现其中的一些问题,同时又能够帮助我们去解决这个问题的一款工具

  • 监控面板
  • 查看字节码信息
  • 方法监控
  • 类的热部署
  • 内存监控
  • 垃圾回收监控
  • 应用热点定位

dashboard:打印所检测执行文件的相关信息

dump:将class文件转存为字节码文件并放置在指定目录中。

jad:反编译已加载类的源码。

curl :提供访问的拼接条件,对接口进行访问

案例:使用阿里arthas定位线上出现的字节码问题

背景:不知道知否将最新的字节码文件部署到服务器上,请使用阿里的arthas去确认升级完的字节码文件是不是最新的。

思路:

  1. 在出问题的服务器上部署一个arthas,并启动
  2. 连接arthas的控制器,使用jad命令加上想要查看的类名,反编译出源码。
  3. 确认源码是否是最新的。

总结:

1、如何查看字节码文件?

  • 如果是本地的文件,可以直接使用jclasslib开打进行查看,开发环境的话 可以使用jclasslib插件
  • 如果是在服务器上文件使用javap命令直接查看,也可以通过arthas的dump命令导出字节码文件再查看本地的文件。还可以使用jad命令反编译出源代码。

2、字节码文件的核心组成有哪些?

  • 基本信息:魔数、字节码文件对应的java版本号访问标识(public final等等)
  • 常量池:保存了字符串常量、类或者接口名、字段名主要在字节码指令中使用
  • 字段:当前类或者接口声名的字段信息
  • 方法:当前类或者接口声名的方法信息字节码指令
  • 属性:类的属性,比如源码的文件名,内部类的列表等等

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

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

相关文章

新的服务器Centos7.6 安卓基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了,我基本上都是通过docker去管理一些容器如:mysql、redis、mongoDB等之类的镜像,还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…

Mysql COUNT() 函数详解

Mysql COUNT 函数详解 COUNT() 的几种用法COUNT(*)COUNT(1)COUNT(column)COUNT(*) 与 GROUP BYCOUNT(*) 与 GROUP BY 和 HAVING COUNT(expr) 的用法COUNT(DISTINCT expr)COUNT(expr) 带条件查询 写在最后 在使用Mysql的时候,作为开发者,聚合函数是肯定会…

yum下载时出现报错 Couldn‘t read a file:// file for file:///mnt/repodata/repomd.xml

得知说yum源指定的/mnt/没有镜像源 发现可能是镜像没有挂载成功 mount /dev/cdrom /mnt 清理一下缓存重新试一下 yum clean all yum install mod_ssl 解决

视觉SLAM数学基础

本文系统梳理从相机成像模型,通过不同图像帧之间的构造几何约束求解位姿变换,再根据位姿变换和匹配点还原三维坐标的过程,可以作为基于特征点法的视觉SLAM的数学基础。 1、相机成像模型 1.1、针孔相机模型 实际相机的成像方式通常很复杂&a…

书生大模型第四期闯关任务与笔记

书生大模型第四期闯关任务与笔记 入门岛第一关 Linux闯关任务:完成SSH连接与端口映射并运行hello_world.py笔记与过程SSH端口映射linux文件管理命令linux进程管理命令 第二关 Python闯关任务:Leetcode 383(笔记中提交代码与leetcode提交通过截图)闯关任务…

【React】深入理解 JSX语法

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

MyBatis——增删查改(XML 方式)

1. 查询 1.1. 简单查询 使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中 如果要操作数据库,需要做以下的配置,与注解…

YJN5216 手提式升降工作灯

YJN5216 手提式升降工作灯 产品简介: 适用于防汛应急抢修、铁路工务、电务、供电、运输等场所小范围检修、施工照明,也适用于电网、公消等行业小方位应急照明使用。 性能特点: 灯具体积小、重量轻,可以实现手提、背行两种携带方式。 灯具…

LeetCode题练习与总结:完美矩形--391

一、题目描述 给你一个数组 rectangles ,其中 rectangles[i] [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。 如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则…

Mac中安装OhMyZsh

Mac中安装OhMyZsh 文章目录 Mac中安装OhMyZsh一、Homebrew二、OhMyZsh1、Oh-My-Zsh配置1.1:主题配置1.2:插件配置(语法高亮和自动提示)1、zsh-autosuggestions(需下载安装):高亮显示所有支持的命…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Llama旋转位置编码代码实现及详解

旋转位置编码RoPE 在旋转位置编码与Transformer和BERT之间的区别中介绍了旋转位置编码(RoPE)的特点和优势,这种输入长度动态可变的优势使得在Llama编码时,不需要掩码将多余的嵌入掩住。为了详细了解RoPE是如何实现的,…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题? 双写一致性主要指在一个数据同时存在于缓存(如Redis)和持久化存储(如MySQL)的情况下,任何一方的数据更新都必须确保另一方数据的同步更新,以保持双方数据的一致状态。这一…

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器,基于CMOSens技术。它提…

计算机新手练级攻略——善用搜索引擎

计算机学生新手练级攻略——善用搜索引擎 在信息爆炸的时代,计算机专业的学生如何有效地自我提升?答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口,更是解决问题的利器。下面,我将分享一些善用搜…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

Unity 网格模型及优化

一个模型中可以包含很多网格,一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格(Sub-Mesh)组成。 在渲染引擎的时候,每个子网格都要匹配一个材质球来做渲染,实际上一个子网格本身就是一个个普通的模型&#xff0…

恒源云使用手册记录:从服务器下载数据到本地

文章目录 一、xftp下载二、通过Xftp客户端连接站点 一、xftp下载 先下载xftp:下载连接 二、通过Xftp客户端连接站点 右击文件,点击新建 名称可以任意 主机、端口号、用户名 点击这里的复制登录命令 比如我这里得到ssh -p 41604 rooti-2.gpushare.co…

ReactPress:功能全面的开源发布平台

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的,包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的,项目已经开源,项目地址在 …

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段:PT(Pre training)。使用公开数据经过预训练得到预训练模型,预训练模型具备语言的初步理解;训练周期比较长;微调阶段1:SFT(指令微调/有监督微调…