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

目录

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等等)
  • 常量池:保存了字符串常量、类或者接口名、字段名主要在字节码指令中使用
  • 字段:当前类或者接口声名的字段信息
  • 方法:当前类或者接口声名的方法信息字节码指令
  • 属性:类的属性,比如源码的文件名,内部类的列表等等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

李佳琦回到巅峰背后,双11成直播电商分水岭

时间倏忽而过,又一年的双11即将宣告结束。 从双11正式开始前的《新所有女生的offer》,到被作为“比价”标杆被其他平台直播间蹭、被与其他渠道品牌比较,再到直播间运营一时手快多发了红包……整个双11周期下来,李佳琦直播间在刷新…

使用iviewui组件库的坑

背景 使用view-design组件库的Input组件的时候,按照产品的要求,输入框中只能键入正整数。 使用效果 如果直接使用组件的type属性,设置类型为number时,乍一看没啥问题,但是当我们键入 小数点(.) 或者 e/E 后面没有跟任…

软件测试学习记录 Day1

根据黑马程序员最新版的软件测试课程所做的笔记,需要原件后台私信: 练习提取测试点: 博主的答案,有不一样看法的可评论区讨论:

uni-app选项卡制作 ⑥

文章目录 十、选项卡制作一 、组件创建二、scroll-view 组件使用三、点击设置按钮跳转到标签设置界面四、数据获取 十、选项卡制作 1.遇到错误: 2.解决问题: 3.this 指向问题 // 指向: get_label_list uniCloud.callFunction({name: "g…

最新x64dbg软件

最新x64dbg软件 1、简介2、调试程序界面3、开源官网 1、简介 最新x64dbg软件-比OD更好的工具,原生支持中文界面和插件。 x64dbg是一款专业的windows系统下的64位调试器,界面简洁、操作简单,与 “OllyDbg” 调试工具非常相似,如果…

【时间之外】IT人求职和创业应知【31】

目录 新闻一:2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二:声网CEO赵斌:RTE将成为生成式AI时代AI Infra的关键部分 新闻三:“5G工业互联网”融合应用试点城市名单…

Docker使用docker-compose一键部署nacos、Mysql、redis

下面是一个简单的例子,展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1,准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…

04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索

文章目录 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索一、多版本并发控制(MVCC)1.1 理论解析1.2 实践应用 二、锁与闩锁机制2.1 理论解析2.2 实践应用 三、事务隔离级别3.1 理论解析3.2 实践应用 四、死锁预防与解决…

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接: [【Python篇】PyQt5 超详细教程——由入门到精通(序篇)](【Python篇】PyQt5 超详细教程——由入门到精通(序篇)-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果,方便理…

计算机的错误计算(一百五十一)

摘要 探讨 MATLAB 中反正弦 asin 与反余弦 acos 函数的计算精度问题。 例1. 已知 计算 及 直接贴图吧: 另外,16位的正确值分别为 0.1570785896071048e1、0.1043072384837152e-4、-0.1570785896071048e1 与 0.3141582222865945e1(I…

FPGA学习笔记#5 Vitis HLS For循环的优化(1)

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 从这一篇开始正式进入HLS对C代码的优化笔记 学习笔记:《…

Spring Plugin与策略模式:打造动态可扩展的应用

目录 一、策略模式 二、Spring Plugin 2.1 Spring Plugin 实现策略模式开发 2.2 策略模式优缺点 三、Spring Plugin 原理 一、策略模式 策略模式是一种设计模式,它允许程序在运行中动态的选择不同的行为方式进行动态执行。策略模式的核心思想是将行为封装在一个个…

Works With线上开发者大会将提供物联网行业深入的专业知识和技能

Silicon Labs2024年Works With线上开发者大会定于11月20日至21日举行,将汇集全球各地的物联网开发人员、设备制造商、无线技术专家、工程师和商业领袖,观众可免费注册参加。同时,为了方便中文观众,所有在线视频均配有中文字幕。 芯…

一文读懂 Web 安全

Web 安全是互联网中不可或缺的一个领域,这个领域中诞生了大量的黑帽子与白帽子,他们都是安全领域的王者,在平时里,他们利用各种巧妙的技术互相博弈,时不时就会掀起一场 Web 安全浪潮,真可谓神仙打架&#x…

iOS问题记录 - 503 Service Temporarily Unavailable

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近有个项目经历了大改动,本地测试没什么问题,于是准备通过打包机打包用于内部测试的包,然后问题就来了。 开发环境 Xcode: 16.1Fastlane: 2.219.0 问题描述 问题出在登录苹果…

数据网格能替代数据仓库吗?

一、数据网格是什么? 数据网格:是一种新兴的数据管理架构和理念,主要用于解决大规模、复杂数据环境下的数据管理和利用问题。 核心概念: 1、数据即产品:将数据看作一种产品,每个数据域都要对其生产的数据负…

Dolphinscheduler配置dataX离线采集任务写入hive实践(二)

这里写目录标题 一、 写入hive 配置1.1 权限报错信息 :1.2 hive 中文件格式1.3 注意区别以下建表语句A、构建ORC 格式分区表B. 构建默认文件格式分区表C.构建非分区表 二、dataX 配置hive 分区表导入 配置2.1 检查hive 表分区是否存在 一、 写入hive 配置 dataX 写…

机器学习——损失函数、代价函数、KL散度

🌺历史文章列表🌺 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

Word大珩助手:超大数字怎么读?35位数字?69位数字?

俄罗斯日前对谷歌开出了20000000000000000000000000000000000(35位数字)美元的罚款 这一数字远超全球GDP总和,消息一出很快就登上热搜。 面对这样一个庞大的数字,人们不禁好奇,这样的数字该如何读出来? …

ODOO学习笔记(2):核心功能是哪些?

Odoo的核心功能主要包括以下几个方面: 客户关系管理(CRM):Odoo的CRM工具管理公司与客户和潜在客户的所有关系和互动,提供一个集中式系统来管理销售活动,从潜在客户培育到达成交易。CRM模块包括报告和分析功…