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.hqwc.cn/news/160412.html

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

相关文章

JsonPath 数据快速查找和提取工具

常用语法 表达式说明$表示根元素$.key选择根元素下的指定键名的值$.*选择根元素下的所有属性值$.array[*]选择根元素中的数组的所有元素$.key[subkey]选择根元素中的键名为key,子键名为subkey的值$.key[*].subkey选择根元素中的键名为key的所有元素的子键名为subke…

4 sql语法基础

1、DISTINCT 相同值只会出现一次。它作用于所有列,也就是说所有列的值都相同才算相同。 2、LIMIT 限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。 返回前 5 行: SELECT * FROM myt…

day02_第一个Java程序

在开发第一个Java程序之前,我们必须对计算机的一些基础知识进行了解。 常用DOS命令 Java语言的初学者,学习一些DOS命令,会非常有帮助。DOS是一个早期的操作系统,现在已经被Windows系统取代,对于我们开发人员&#xf…

DC系列 DC:4

DC:4 靶机 文章目录 DC:4 靶机信息收集IP端口收集网页信息收集网站信息收集bp爆破 反弹shellnc反弹 内网信息收集收集jim用户的密码密码爆破 Charles用户密码收集 提权teehee提权 备注 信息收集 IP端口收集 用arp-scan 网段锁定ip nmap对端口服务进行详细扫描nmap -p- -sV …

数据库实验:SQL的数据定义与单表查询

目录 实验目的实验内容实验要求实验过程实验步骤实例代码结果示意 数据库的实验,对关系型数据库MySQL进行一些实际的操作 实验目的 (1) 掌握DBMS的数据定义功能 (2) 掌握SQL语言的数据定义语句 (3) 掌握RDBMS的数据单表查询功能 (4) 掌握SQL语言的数据单表查询语句…

python模块的介绍和导入

python模块的介绍和导入 概念 在Python中,每个Python代码文件都是一个模块。写程序时,我们可以将代码分散在不同的模块(文件)中,然后在一个模块中引用另一个模块的内容。 导入格式 1、在一个模块中引用(导入)另一个模块可以使用import语句…

nvm 下载 nodejs 速度慢问题解决

1、找到 nvm 的下载目录,在目录下找到 settings.txt 文件 2、打开 settings.txt 文件 ,添加以下代码: node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/添加完成后再去下载即可。

字节测试开发面试分享,太难了...

一面 首先,自我介绍,我介绍了自己的技术栈和项目。 技术栈提到过Spring、Redis、Kafka、Docker、K8s、大数据。 项目提到过接口和UI自动化。 我有个大数据平台项目,问了比较多,聊着聊着,提到自己研究过Selenium、T…

由于找不到vcruntime140.dll无法继续执行代码

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“vcruntime140.dll丢失”。这个错误通常发生在运行某些程序或游戏时,它会导致程序无法正常运行。那么,如何解决vcruntime140.dll丢失的问题呢?本文将介绍…

第九周实验记录

1、安装Nerfstudio 环境配置 首先需要创建环境python3.8,接着需要安装cuda11.7或11.3 这里安装cuda11.7 pip uninstall torch torchvision functorchpip install torch1.13.1 torchvision functorch --extra-index-url https://download.pytorch.org/whl/cu117安…

深度学习之基于Python+OpenCV+dlib的考生信息人脸识别系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在人脸识别领域的应用已经取得了显著的进展。Python是一种常用的编程语言,它提供了许多强大的库…

最新版一媒体7.3、星媒体、皮皮剪辑,视频MD ,安卓手机剪辑去重神器+搬运脚本+去视频重软件工具

最新版一媒体app安卓版介绍: 这是一款功能强大的视频搬运工具,内置海量视频编辑工具,支持一键智能化处理、混剪、搬运、还能快速解析和去水印等等,超多实用功能等着您来体验! 老牌手机剪辑去重神器,用过的…