JVM系列-2.字节码文件详解

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
  • 📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

字节码文件详解

JVM的组成

字节码文件的组成

学习字节码文件有什么用呢?

能够从字节指令的角度去回答疑难杂症的面试题。

其他的应用场景呢?

以正确的姿势打开文件

字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,无法直接用记事本打开阅读。

通过NotePad++使用十六进制插件查看class文件:

推荐使用jclasslib工具查看字节码文件。

在github下载之后打开

接下来简单分析下字节码中的信息。

详细的看一下里面的字节码指令

字节码文件的组成

字节码文件的组成部分-Magic魔数

文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。

软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该种类型就会出错。

Java字节码文件中,将文件头称为magic魔数。

字节码文件的组成部分-主副版本号

主版本号不兼容导致的错误

需求:

解决以下由于主版本号不兼容导致的错误

两种方案:

1.升级JDK版本

2.将第三方依赖的版本号降低或者更换依赖,以满足JDK版本的要求 (容易引发其他的兼容性问题,并且需要大量的测试)√ 建议采用

字节码文件的组成部分-常量池

字节码文件中常量池的作用:避免相同的内容重复定义,节省空间。

常量池中的数据都有一个编号,编号从1开始。在字段或者字节码指令中通过编号可以快速的找到对应的数据。

字节码指令中通过编号引用到常量池的过程称之为符号引用。

字节码文件的组成部分-方法

一个非常有意思的面试题:

字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中。

操作数栈是临时存放数据的地方,局部变量表是存放方法中的局部变量的位置。

i=i++的执行流程:

i=++i的执行流程:

通过分析方法中的字节码指令,我们成功的解决了这个问题

字节码文件常用工具

玩转字节码常用工具: javap -v命令

javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容。

直接输入javap查看所有参数。

输入javap -v 字节码文件名称 查看具体的字节码信息。(如果jar包需要先使用 jar --xvf 命令解压

例如:javap -v /opt/jvm/BOOT-INF/classes/com/itheima/springbootclassfile/pojo/vo/UserVo.class > /opt/jvm

玩转字节码常用工具: jclasslib插件

jclasslib也有Idea插件版本,建议开发时使用Idea插件版本,可以在代码编译之后实时看到字节码文件内容。

需要将该文件从服务器上下载下来才能使用jclasslib

玩转字节码常用工具: 阿里arthas

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,大大提升线上问题排查效率。

下载好的atheas是一个jar,通过 java -jar arthas.jar 启动

输入5就可以进入到对应的程序中

其中arthas包含了很多功能

dump 类的全限定名:dump已加载类的字节码文件到特定目录。

jad 类的全限定名: 反编译已加载类的源码。

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

背景: 小李的团队昨天对系统进行了升级修复了某个bug,但是升级完之后发现bug还是存在,小李怀疑是因为没有把最新的字节码文件部署到服务器上,请使用阿里的arthas去确认升级完的字节码文件是不是最新的。

思路:

  1. 在出问题的服务器上部署一个 arthas,并启动。
  2. 连接 arthas的控制台,使用 jad命令加上想要查看的类名,反编译出源码。
  3. 确认源码是否是最新的。
相关推荐
志辉AI编程1 分钟前
别人还在入门,你已经精通!Claude Code进阶必备14招
后端·ai编程
代码老y8 分钟前
Spring Boot项目中大文件上传的高级实践与性能优化
spring boot·后端·性能优化
paishishaba11 分钟前
处理Web请求路径参数
java·开发语言·后端
程序无bug14 分钟前
Java中的8中基本数据类型转换
java·后端
雨落倾城夏未凉18 分钟前
8.Qt文件操作
c++·后端·qt
51721 分钟前
Django中序列化与反序列化
后端·python·django
也许明天y23 分钟前
Spring Cloud Gateway 自定义分布式限流
redis·后端·spring cloud
一块plus1 小时前
深度详解 Revive 和 Precompile 技术路径
后端·设计模式·架构
iOS开发上架哦1 小时前
没有Mac如何完成iOS 上架:iOS App 上架App Store流程
后端
晴空月明1 小时前
分布式系统高可用性设计-负载均衡与容错机制深度解析
后端