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.rhkb.cn/news/181408.html

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

相关文章

外卖系统的运转:背后的技术和管理细节

外卖系统的运作涉及许多技术和管理方面,其中包括前端应用程序、后端服务器、数据库管理、订单处理和配送等环节。 技术细节: 前端应用程序: 外卖平台的用户界面,包括顾客点餐界面和餐厅端的接单界面。通常使用HTML、CSS和JavaS…

C++: 类和对象(中)

文章目录 1. 类的6个默认成员函数2. 构造函数构造函数概念构造函数特性特性1,2,3,4特性5特性6特性7 3. 析构函数析构函数概念析构函数特性特性1,2,3,4特性5特性6 4. 拷贝构造函数拷贝构造函数概念拷贝构造函数特性特性1,2特性3特性4特性5 5. 运算符重载一般运算符重载赋值运算符…

Instant-NGP论文笔记

文章目录 论文笔记 论文笔记 instant-ngp的nerf模型与vanilla nerf的模型架构相同。 instant-ngp的nerf模型包含两个MLP,第一个MLP就两个全连接,输入维度是32(16层分辨率x2),输出是16(用于预测密度&#x…

高防CDN:游戏应用抵御DDoS攻击的坚固堡垒

在当今的数字时代,游戏应用已经成为人们生活的一部分,而面临的网络威胁也日益复杂。其中,DDoS(分布式拒绝服务)攻击是游戏应用的一项严重威胁,可能导致游戏服务不可用,用户流失,以及…

Oracle安全基线检查

一、账户安全 1、禁止SYSDBA用户远程连接 用户具备数据库超级管理员(SYSDBA)权限的用户远程管理登录SYSDBA用户只能本地登录,不能远程。REMOTE_LOGIN_PASSWORDFILE函数的Value值为NONE。这意味着禁止共享口令文件,只能通过操作系统认证登录Oracle数据库。 1)检查REMOTE…

MASK-RCNN tensorflow环境搭建

此教程默认你已经安装了Anaconda,且tensorflow 为cpu版本。为什么不用gpu版本,原因下面解释。 此教程默认你已经安装了Anaconda。 因为tensorflow2.1后的gpu版,不支持windows。并且只有高版本的tensorflow才对应我的CUDA12.2; 而…

升级 MacOS 系统后,playCover 内游戏打不开了如何解决

我们有些小伙伴在升级了 macOS 系统后大概率会遇到之前能够正常使用的 playCover 突然游戏打不开了,最近 mac 刚刚正式推出了 MacOS 14.1 ,导致很多用户打开游戏会闪退,我们其实只需要更新一下 playCover 就可以解决 playCover 正式版更新会比较慢所以我…

vue-admin-template 安装遇到的问题

vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现。 参考文档: 官网: https://panjiachen.github.io/vue-element-admin-site/zh/guide/#%E5%8A%9F%E8%83%BD遇到的问题: npm ERR! Error while executing…

最新Ai系统ChatGPT程序源码+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

APP攻防--ADB基础

进入app包 先使用 adb devices查看链接状态 手机连接成功的 adb shell 获取到手机的一个shell 此时想进入app包时没有权限的,APP包一般在data/data/下。没有执行权限,如图 Permission denied 权限被拒绝 此时需要手机root,root后输入 su …

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言: VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验,还为景区旅游文化注入了新的生机。 一.VR全景技术:革新旅游体验 1.什么是VR全景技术? VR全景技术是一种虚拟现实技术&am…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(六)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

【ES专题】ElasticSearch集群架构剖析

目录 前言阅读对象阅读导航前置知识笔记正文一、ES集群架构1.1 为什么要使用ES集群架构1.2 ES集群核心概念1.2.1 节点1.2.1.1 Master Node主节点的功能1.2.1.2 Data Node数据节点的功能1.2.1.3 Master Node主节点选举流程 1.2.2 分片1.3 搭建三节点ES集群1.3.1 ES集群搭建步骤1…

数据库实验:SQL的数据更新

目录 实验目的实验内容实验要求实验步骤实验过程总结 再次书接上文,sql基础的增删改查 实验目的 (1) 掌握DBMS的数据查询功能 (2) 掌握SQL语言的数据更新功能 实验内容 (1) update 语句用于对表进行更新 (2) delete 语句用于对表进行删除 (3) insert 语句用于对表…

MSF暴力破解SID和检测Oracle漏洞

暴力破解SID 当我们发现 Oracle 数据库的 1521 端口时,我们可能考虑使用爆破 SID(System Identifier)来进行进一步的探测和认证。在 Oracle 中,SID 是一个数据库的唯一标识符。当用户希望远程连接 Oracle 数据库时,需要了解以下几个要素:SID、用户名、密码以及服务器的 I…

正点原子嵌入式linux驱动开发——Linux 网络设备驱动

网络驱动是linux里面驱动三巨头之一,linux下的网络功能非常强大,嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动,本章就来学习一下linux里面的网络设备驱动。 嵌入式网络简介 嵌入式下的网络硬件接口 本次笔记…

分享一次无线话筒和接收机的配对经历BK9521/9522

最近老婆喜欢上了唱歌。我就需要为她准备歌曲和设备。装了台点歌机,买了软件,用4天的时间下了4T容量的歌曲,听过的没听过的都在里面,真的是太多了。 有了歌曲,就要有唱歌设备了。当我准备买无线话筒的时候&#xff0c…

centos7中多版本go安装

安装go的方式 官网下载tar.gz包安装 # 1.下载tar包 wget https://go.dev/dl/go1.18.1.linux-amd64.tar.gz # 2.解压tar包到指定路径 tar -xvf go1.18.1.linux-amd64.tar.gz -C /usr/local/go1.18 # 3.配置环境变量,打开 /etc/profile 文件添加以下文件每次开机时…

论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings

1. 优势 现存的emmbedding应用在新的task或者domain上时表现会有明显下降,甚至在相同task的不同domian上的效果也不行。这篇文章的重点就是提升embedding在不同任务和领域上的效果,特点是不需要用特定领域的数据进行finetune而是使用instuction finetun…

C++对象模型

思考:对于实现平面一个点的参数化。C的class封装看起来比C的struct更加的复杂,是否意味着产生更多的开销呢? 实际上并没有,类的封装不会产生额外的开销,其实,C中在布局以及存取上的额外开销是virtual引起的…