JVM字节码文件浅谈

news2024/11/25 0:56:28

文章目录

  • 版权声明
  • 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.coloradmin.cn/o/1171150.html

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

相关文章

Docker 安装ELK7.7.1

(在安装之前,本方法必须安装jdk1.8以上版本) 一、安装elasticsearch 1、下载elasticsearch7镜像:docker pull elasticsearch:7.7.1 2、创建挂载目录:mkdir -p /data/elk/es/{config,data,logs} 3、赋予权限:chown -R 1000:100…

JS-函数

定义方式一 定义方式二 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-函数</title> <…

Ipswitch WS_FTP 12 安裝

Ipswitch WS.FTP.Professional.12.6.rar_免费高速下载|百度网盘-分享无限制 This works but quite difficult to figure out. It didnt allow me to replace the wsftpext.dll at 1st and had to test lots of ways how to replace it. This is how I did: 1. Follow the instr…

curl(六)DNS解析、认证、代理

一 DNS解析 ① ip协议 使用ipv4 [-4] 还是ipv6 [-6] ② --resolve 场景&#xff1a; 在不修改系统配置文件 /etc/hosts 的情况下将单个请求临时固定到 ip 地址 1、使用 * 作为通配符,这样请求中调用的所有 Host 都 会转到你指定的 ip curl https://www.wzj.com --resolv…

我用 ChatGPT 的探索与实践

本文主要介绍在实际的开发过程当中&#xff0c;如何使用GPT帮助开发&#xff0c;优化流程&#xff1b;本文所有代码和脚本均是利用GPT生成。 技术交流群 建了技术答疑、交流群&#xff01;想要进交流群、资料的同学&#xff0c;可以直接加微信号&#xff1a;mlc2060。加的时候…

vSLAM中IMU预积分的作用--以惯性导航的角度分析

作为一个学过一点惯导的工程师&#xff0c;在初次接触视觉slam方向时&#xff0c;最感兴趣的就是IMU预积分了。但为什么要用这个预积分&#xff0c;在看了很多材料和书后&#xff0c;还是感觉模模糊糊&#xff0c;云里雾里。 在接触了vSLAM的更多内容后&#xff0c;站在历史研究…

图解系列--理解L3交换机的性能与功能

04.01 何为 L3 交换机 L3交换机是一种在L2 交换机的基础上增加了路由选择功能的网络硬件&#xff0c;能够通过基于ASIC 和 FPGA 的硬件处理高速实现网络功能和转发分组。L2 是指 OSI 参考模型中的L2, 也就是数据链路层。L2 交换机能够基于该层主要编址的 MAC 地址&#xff0c;…

【记】一次common模块导入无效的bug

首先Maven clean install无用 然后idea清除缓存重启无用 pom.xml文件重载无效 正确解决路径&#xff1a; 1.检查common模块的父工程导入和自身模块的声明是否正确 默认是继承父工程的groupid&#xff0c;可以不用再声明 2.检查子工程是否引入正确的common&#xff0c;org不要…

【漏洞复现】Fastjson_1.2.47_rce

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞检测3、漏洞验证 1.5、深度利用1、反弹Shell 说明内容漏洞编号漏洞名称Fastjson_1.2.47_远程执行漏…

面试题:接口幂等性是什么?如何设计?

文章目录 前言什么是接口幂等&#xff1f;为什么接口需要幂等性设计前端重复提交表单黑客恶意攻击接口超时重复提交消息重复消费 哪些接口需要幂等&#xff1f;如何实现幂等前端拦截数据库唯一索引实现数据库乐观锁实现数据库悲观锁实现JVM锁实现分布式锁实现 Token实现总结 前…

多式联运路径优化问题:基于拓扑排序的遗传算法染色体编码

一、什么是拓扑排序 在图论中&#xff0c;拓扑排序&#xff08;Topological Sorting&#xff09;是一个有向无环图&#xff08;DAG, Directed Acyclic Graph&#xff09;的所有顶点的线性序列。且该序列必须满足下面两个条件&#xff1a; 每个顶点出现且只出现一次。若存在一…

【漏洞复现】Apache_Tomcat7+ 弱口令 后台getshell漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号漏洞名称Tomcat7 弱口令 && 后台getshell漏洞漏洞评级高…

私域营销必备:轻松掌握微信CRM管理方法

大家在微信私域营销中都遇到了什么问题&#xff1f; 比如管理时间不够&#xff0c;群发实效性低&#xff0c;自动回复无法适应变化等等。 我们可以利用微信CRM这个工具&#xff0c;轻松解决这些问题。 请问你们最想用这个工具解决什么问题呢&#xff1f; 使用微信CRM不仅可…

React 底层 Fiber 架构 简单理解

一、 背景 JS 是引擎是单线程运行的&#xff1b;严格来说&#xff0c;JS 引擎和页面渲染引擎在同一渲染线程&#xff0c;两者互斥。那么就会遇到这样的一种情况&#xff1a;当前面一个任务长期霸占CPU&#xff0c;后面啥事也干不了&#xff0c;浏览器卡死&#xff0c;造成极差…

latex空心小写字母、数字

公式中可用 R \R R、 E \mathbb{E} E 等空心大写字母表示集合、期望等&#xff0c;latex 用 \mathbb 实现。有时想用空心的小写字母&#xff08;虚数单位&#xff0c;因 i 已用来表示下标&#xff09;和数字&#xff08;指示函数用空心 1&#xff09;&#xff0c;此时 \mathbb…

扩容一个新节点

1.删除nodes rm -rf nodes/ 2.挂载本地文件与创建节点 bash build_chain.sh -f ipconf -e /root/tools/fisco-bcos 3.部署节点 bash nodes/127.0.0.1/start_all.sh 4.把共享的gen_node_cert.sh文件下载到本地 cp /root/Desktop/共享文件夹/tools/gen_node_cert.sh ./…

selenium自动化测试入门 —— 操作元素对象

一、元素的常用操作 element.click() # 单击元素&#xff1b;除隐藏元素外&#xff0c;所有元素都可单击 element.submit() # 提交表单&#xff1b;可通过form表单元素提交表单 element.clear() # 清除元素的内容&#xff1b;如果可以的话 element.send_keys(‘需要输入的…

自动驾驶学习笔记(六)——Apollo安装

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 Apollo安装 硬件配置 安装Ubuntu…

C++笔记之vector的成员函数swap()和data()

C笔记之vector的成员函数swap()和data() 标准C中的std::vector类确实有swap()和data()这两个成员函数。下面是它们的简要描述&#xff1a; swap(): std::vector的swap()成员函数用于交换两个向量的内容&#xff0c;实现了高效的交换操作&#xff0c;不需要复制向量的元素。这…

『PyQt5-基本控件』| 16 什么是屏幕坐标系?

16 什么是屏幕坐标系? 1 什么是屏幕坐标系?2 相关概念3 代码实现4 获取窗口坐标4.1 直接获取4.2 通过坐标系获取4.3 获取Frame坐标1 什么是屏幕坐标系? 2 相关概念 屏幕坐标系,即窗口相对于屏幕的坐标。屏幕左上角坐标称为原点坐标(0,0);窗口的坐标,即窗口的左上角相对…