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. 确认源码是否是最新的。
相关推荐
芯冰乐27 分钟前
综合时如何计算net delay?
后端·fpga开发
用户673559885613 小时前
数据驱动,实时监控显威力 —— 淘宝商品详情API助力商家精准营销
后端·api·fastapi
lucifer3113 小时前
线程池与最佳实践
java·后端
用户673559885613 小时前
天猫店铺商品列表API返回值中的商品视频与图文详情
前端·javascript·后端
程序员大金3 小时前
基于SSM+Vue+MySQL的酒店管理系统
前端·vue.js·后端·mysql·spring·tomcat·mybatis
程序员大金4 小时前
基于SpringBoot的旅游管理系统
java·vue.js·spring boot·后端·mysql·spring·旅游
Pandaconda4 小时前
【计算机网络 - 基础问题】每日 3 题(十)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展
程序员大金5 小时前
基于SpringBoot+Vue+MySQL的养老院管理系统
java·vue.js·spring boot·vscode·后端·mysql·vim
customer085 小时前
【开源免费】基于SpringBoot+Vue.JS网上购物商城(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Ylucius5 小时前
JavaScript 与 Java 的继承有何区别?-----原型继承,单继承有何联系?
java·开发语言·前端·javascript·后端·学习