JVM字节码文件浅谈

文章目录

  • 版权声明
  • java虚拟机的组成
  • 字节码文件
    • 打开字节码文件的姿势
    • 字节码文件的组成
      • 魔数(基本信息)
      • 主副版本号(基本信息)
      • 主版本号不兼容的错误解决方法
      • 基本信息
      • 常量池
      • 方法
    • 字节码文件的常用工具
      • javap -v命令
      • jclasslib插件
      • 阿里arthas

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

java虚拟机的组成

JVM包含以下组成部分:

  1. 类加载器(Class Loader):负责将Java字节码加载到JVM中,并将其转换为JVM可以理解的格式。

  2. 运行时数据区(Runtime Data Area):JVM在运行时会将内存划分为不同的数据区域,包括方法区、堆、栈、程序计数器等,用于存储程序运行时所需要的数据。

  3. 执行引擎(Execution Engine):负责执行Java字节码,将其转换为机器码并执行。

  4. 本地方法接口(Native Interface):提供了与本地代码交互的接口,可以使用C、C++等语言编写本地代码,并通过JNI(Java Native Interface)与Java程序交互。

  5. Java标准库(Java API):提供了大量的类和接口,包括I/O、网络、集合、线程等常用功能。

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

Java Virtual Machine
Runtime Data Area
Loads
Loads
Used by
Used by
Used by
Controls
Calls
Interacts with
Optional: JIT Compiler
Class Loader
Execution Engine
Native Interface
Java Standard Library
Method Area
Heap
Stacks
Program Counter Register
Native Method Stack

字节码文件

打开字节码文件的姿势

  1. 使用Jclasslib工具,idea中可以直接安装jclasslib插件
    在这里插入图片描述
  2. 然后打开字节码文件后,选择工具栏中的视图->shoe ByteCode with jclasslib,即可
    在这里插入图片描述

在这里插入图片描述

  • 如果源码文件修改后,字节码文件为未更新,选择构建重新编译文件即可!
    在这里插入图片描述

字节码文件的组成

  • Java字节码文件是一种中间代码,它包含了Java程序的编译版本。
  • 字节码文件的组成结构主要包括以下几个部分:
    在这里插入图片描述
Magic Number
Version
Constant Pool
Access Flags
Class Index
Parent Class Index
Interface Indexes
接口
Field Table
Method Table
字段信息
方法信息
Attribute Table

魔数(基本信息)

  1. 魔数(Magic Number):Java字节码文件的开头四个字节是一个魔数,它是一个特殊的标识,用于表明这是一个有效的字节码文件。
    在这里插入图片描述
    • 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。
    • 软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该种类型就会出错
    • 魔数的数值为0xCAFEBABE
      在这里插入图片描述

主副版本号(基本信息)

  1. 版本信息:紧随魔数后的两个字节表示Java字节码文件的主版本号和次版本号
    • 主副版本号指的是编译字节码文件的JDK版本号,主版本号用来标识大版本号,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升级一个大版本就加1
    • 副版本号是当主版本号相同时作为区分不同版本的标识,一般只需要关心主版本号。
    • 版本号的作用主要是判断当前字节码的版本和运行时的JDK是否兼容

在这里插入图片描述


主版本号不兼容的错误解决方法

  • 解决以下由于主版本号不兼容导致的错误
    在这里插入图片描述
    两种方案:
  1. 升级JDK版本(容易引发其他的兼容性问题,并且需要大量的测试)
  2. 建议采用:将第三方依赖的版本号降低或者更换依赖,以满足JDK版本的要求

基本信息

  • 上面的魔数和主副版本号都属于基本信息部分,基本信息还包含
    • 访问标志(Access Flags):这个字段定义了类或接口的访问权限,例如public、final、abstract等。
    • 类和父类信息:字节码文件包括了对当前类的名称和父类的名称的引用。这些引用通常以全限定名的形式出现,例如java/lang/Object。
    • 接口表(Interfaces):这个表格包含了类实现的接口的索引,用于描述类的继承关系。
      在这里插入图片描述

常量池

  • 常量池(Constant Pool):它是一个表格结构,用于存储字面值、符号引用、字段和方法的描述等各种常量。
    • 字节码文件中常量池的作用:避免相同的内容重复定义,节省空间
    • 常量池在字节码文件中起到类似符号表的作用,它包含了类文件中用到的各种符号和字面值。
    • 常量池中的常量索引从1开始,0被用于表示不引用任何常量。
    • 字节码指令中通过编号引用到常量池的过程称之为符号引用
      在这里插入图片描述
  1. 字段表(Fields):这个表格包含了类的字段的描述,包括字段名、字段类型以及访问标志。
  2. 属性表(Attributes):每个类、字段和方法可以包含属性表,用于存储额外的信息。属性表通常包括源代码行号、局部变量表信息、异常处理信息等。
  3. 字节码指令集:字节码文件包含了实际的字节码指令,这些指令定义方法的具体操作和行为。字节码指令集是由一系列操作码(opcode)和操作数组成,用于执行方法中的逻辑。

方法

  • 字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中
    在这里插入图片描述
  • 操作数栈是临时存放数据的地方,局部变量表是存放方法中的局部变量的位置
    在这里插入图片描述
  • i=i++的执行流程
    在这里插入图片描述
  • i=++i的执行流程
    在这里插入图片描述
  • int i = 0; i = i++; 最终i的值是多少?
  • 答案是0,通过分析字节码指令发现,i++先把0取出来放入临时的操作数栈中,接下来对i进行加1,i变成了1,最后再将之前保存的临时值0放入i,最后i就变成了0。

字节码文件的常用工具

javap -v命令

  • javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容。
  • 直接输入javap查看所有参数
  • 输入javap -v 字节码文件名称 查看具体的字节码信息。(如果jar包需要先使用 jar –xvf 命令解压)

jclasslib插件

  1. 使用Jclasslib工具,idea中可以直接安装jclasslib插件
    在这里插入图片描述
  2. 然后打开字节码文件后,选择工具栏中的视图->shoe ByteCode with jclasslib,即可
    在这里插入图片描述

在这里插入图片描述

  • 如果源码文件修改后,字节码文件为未更新,选择构建重新编译文件即可!
    在这里插入图片描述

阿里arthas

在这里插入图片描述

  • Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,大大提升线上问题排查效率。
  • 官网
    在这里插入图片描述
  • 具体使用,可以去B站或官网学习使用!

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

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

相关文章

搭建Qt5.7.1+kylinV10开发环境、运行环境

1.下载Qt源码 Index of / 2.编译Qt 解压缩qt-everywhere-opensource-src-5.7.1.tar.gz 进入到qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs这个目录下, 2.1找到以下目录 复制他,然后改名linux-x86-arrch64,博主这里名字取的有些问…

循环链表(单循环、双循环)(数据结构与算法)

循环链表:循环单链表、循环双链表 1. 循环单链表 循环单链表(Circular Singly Linked List)是一种特殊类型的单链表,其中最后一个节点的指针指向头节点,形成一个循环。 循环单链表与普通单链表的主要区别在于&#xf…

汽车标定技术(三)--XCP协议如何支持测量功能

目录 1. 概述 2. 测量方式 -- Poll 3. 测量方式 -- DAQ 3.1 ODT概念模型 3.2 DAQ List概念 3.3 ODT 绝对编号和相对编号 3.4 静态DAQ和动态DAQ模式 (1)静态DAQ (2)动态DAQ 4.小结 1. 概述 在该系列的首篇文章汽车标定技…

python把Word题库转成Excle题库

又到了一年一度的背题时刻,但是收到的题库是Word版的,页数特别多 话不多说,上代码,有图有真相,代码里面备注的很详细 # 导入所需库 import csv import os import refrom docx import Document from win32com import c…

tcp/ip协议2实现的插图,数据结构2 (15 - 章)

(40) 40 十五1 插口层 结构socket,sysent (41) 41 十五2 插口层 实用函数与file结构描述汇总 (42) 42 十五3 插口层 函socket,socreate,pr_usrreq (43)

工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化

业务流程是由“活动”(或称“工作任务”)构成的,在企业里的所有工作是不是都叫流程,或者属于流程的一部分,这个概念很绕,我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性(产…

接口测试之什么是接口文档?

一、为什么要有接口文档? 没有接口文档的接口测试都是在抓瞎~前面的接口测试重点讲了协议,也讲了fiddler模拟接口请求,估计大部分还是不太懂怎么下手测试。这里小编专门拿出接口文档来做接口测试参考(估计很多测试小伙伴没见过接口…

Azure 机器学习 - 使用无代码 AutoML 训练分类模型

了解如何在 Azure 机器学习工作室中使用 Azure 机器学习自动化 ML,通过无代码 AutoML 来训练分类模型。 此分类模型预测某个金融机构的客户是否会认购定期存款产品。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管…

Linux中命令lsattr/chattr

一、介绍 lsattr 命令用于显示文件属性。 用chattr执行改变文件或目录的属性,可执行lsattr指令查询其属性。 二、语法 lsattr: - -a 显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上…

解决 React forwardRef 与 TypeScript 泛型组件冲突的问题

forwardRef是一个可以将组件内的ref对外暴露的高阶组件,当你的组件需要对外暴露元素的Ref,或者想对外暴露某些内部方法,就可以使用这个 (对应vue3的 expose 方法) 但是当forwardRef与TypeScript泛型组件结合时&#xf…

java的线程池

线程池 可以做什么怎么创建 先了解下线程的生命周期 解释: 新建:线程创建但未被启动可运行:线程处于可运行的状态,当该线程有cpu的时间片后就可以执行睡眠:线程进入计时等待,等待一段指定的时间,可以通过wait()方法,sleep方法,join()方法等方式等待:线程进入等待模式,直到其…

Smooth L1 loss |IoU|DIoU|CIoU|EIoU|aIoU|SIoU|wise-IoU的通俗讲解

文章目录 1. L1 Loss、L2 Loss 、Smooth L1 Loss1.1 L1 Loss和 L2 Loss1.2 Smooth L1 Loss1.3 Smooth L1 Loss 在目标检测中存在的缺陷2 IoU loss2.1 IoU原理2.2 IoU 的缺点2.3 代码3.GIoU Loss3.1 GIoU 原理3.2 GIoU loss 的缺点3.3 代码4.DIoU Loss4.1 DIoU的原理4.2 代码5.C…

[CSP-J 2022] 乘方

Description 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b,求 ab 的值是多少。 ab 即 b 个 a 相乘的值,例如 23 即为 3 个 2 相乘,结果为 2228。 “简单!”小文心想&#…

抖音群控软件的作用是什么?

随着智能手机的普及和社交媒体的兴起,抖音成为了人们日常生活中不可或缺的一部分,许多人都通过抖音平台分享自己的生活、展示才艺、开展商业活动等。 然而,要想在抖音上获得更多的关注和收益,需要投入大量的时间和精力&#xff0…

2023下半年北京软考高项-系统架构设计师-考试心得分享

本博文至所有开发人员,一起分享,助力计划软考的所有战士们! 总得一句话:考的内容永远是自己不熟悉的,题目永远是自己没压中的,座位分配永远是无法白票的位置。。。。。。。惨不忍睹~!&#xff…

Elasticsearch集群搭建、数据分片以及位置坐标实现附近的人搜索

集群搭建、数据分片 es使用两种不同的方式来发现对方: 广播单播也可以同时使用两者,但默认的广播,单播需要已知节点列表来完成 一 广播方式 当es实例启动的时候,它发送了广播的ping请求到地址224.2.2.4:54328。而其他的es实例使用同样的集群名称响应了这个请求。 一般这…

【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

教程背景 课程作业要求使用反编译技术,在游戏中实现无碰撞。正常情况下碰撞后角色死亡,修改为直接穿过物体不死亡。 需要准备的软件 il2CppDumper。DnSpy。IDA Pro。AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_…

节能增效:FP做独立站必须知道的黑科技

独立站作为由商家自己运营和管理,拥有完整的商品展示、订单处理等功能。相比于第三方电商平台,独立站的优势在于可以更好地控制产品质量、价格和服务,同时也有利于建立品牌的形象和忠诚度。 因此,对于一些希望形成自己的用户群体…

基于jsp的采购管理系统的分析与实现

物资采购管理系统是针对内部而设计的,应用于的局域网,这样可以使得内部管理更有效的联系起来。企业采购管理系统是将IT技术用于企业采购信息的管理, 它能够收集与存储企业采购的档案信息,提供更新与检索企业采购信息档案的接口;提…

OpenGL ES入门教程(二)之绘制一个平面桌子

OpenGL ES入门教程(二)之绘制一个平面桌子 前言0. OpenGL绘制图形的整体框架概述1. 定义顶点2. 定义着色器3. 加载着色器4. 编译着色器5. 将着色器链接为OpenGL程序对象6. 将着色器需要的数据与拷贝到本地的数组相关联7. 在屏幕上绘制图形8. 让桌子有边框…