JVM调优篇之JVM基础入门AND字节码文件解读

news2024/11/27 22:09:46

目录

    • Java程序编译
    • class文件内容
    • 常量池
    • 附录-访问标识表
    • 附录-常量池类型列表

Java程序编译

Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。
在这里插入图片描述
规范

Java虚拟机有自己的一套规范,遵循这套规范,任何形式的语言都可以在JVM上运行,前提是编译成class文件,此规范相见oracle官网文档。

实现
JVM虚拟机落地实现有很多,常见的有:

  • Hotspot,使用最热门的JVM
  • OpenJ9,IBM开发
  • MicroSoft JVM 微软开发
  • TaobaoVM 淘宝开发
  • azul zing VM 垃圾回收行业标杆,最快

class文件内容

从上图内容可看出class文件包以下几个方面内容:

  • 魔数(magic number)占4个字节,固定的值0xcafebabe,主要来校验class文件。
  • version 版本号,分为小版本号minor version和大版本号major version,各占两个字节。
  • 常量池信息(constant_pool),具体的各种常量信息,字符串,类名,方法名,字段名等。
  • 访问标识(access_flag),2个字节描述类与接口的修饰符,有几个常见的常量值见附录-访问标识
  • 当前类(this_class
  • 当前类的父类(super_class
  • 具体的接口信息(interfaces
  • 具体的属性信息(fileds
  • 具体的方法信息(methods
  • 其它附加属性信息(attributes

更具体的内容如下:

项目Value
Magic Number魔数(CAFE BABE)
Minor Number次版本号
Major Number主版本号
constant_pool_count常量池数量
constant_pool常量池具体实现,是一种表
access_flag访问标识
this_class当前类名
super_class父类名称
interfaces_count接口数量
interfaces具体实现的接口信息
fileds_count属性数量
fileds具体属性信息
methods_count方法数量
methods具体方法的信息
attributes_count其它附加属性的数量
attributes其它附加属性具体信息

现在来看具体示例来看上面的代表是什么意思,准备一个简单的类:

public class ByteCode01 {
    public ByteCode01() {
    }
}

编译之后的字节码文件:

在这里插入图片描述

class文件中就是一个二进制字节流,非0即1,数据类型有五种,u1,u2,u4,u8和_info表类型

上述这种文件需要借助工具来分析具体内容,在idea安装jclasslib插件看Java文件编译成class文件信息,选中编译后的class文件,如下图所示:

在这里插入图片描述
访问标识是固定的值,通过位运算得出的0x0021既代表public又代表super0x00210x00010x0020位与运算),详见附录-访问标识表

更直观的表现:

在这里插入图片描述

常量池

本类索引即当前类名(this_class),cp_infoconstant_pool的表类型,#2是第二张表,cp_info #2代表常量池第二张表,存的是对cp_info #14的引用,cp_info #14存的是具体的字符串值,就是当前类的类名。

在这里插入图片描述
在这里插入图片描述
class文件中都有属于自己的常量池,常量池包含类型列表,来存储类、方法、字段、接口等信息,以及各种字面量,通过解析常量池可以访问这些字符串信息。比如上图出现的CONSTANT_Utf8_infoCONSTANT_Class_info等详见文末常量池类型列表

着重看下CONSTANT_Utf8_info,它用来存储 UTF-8 编码的字符串,相当于一张常量池表,看一下它的具体结构:

字段名字节数描述
tag1CONSTANT_Utf8_info的常量类型是1(其余的见文末常量池类型列表
length2u2(2 字节无符号数) 类型字段,表示 bytes 部分字节长度,以字节为单位的
byteslength实际字符串数据,采用 UTF-8 编码显示

比如

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

字符串 Hello, World!,会以 CONSTANT_Utf8_info 类型存储在常量池中,对应的二进制内容或许是:

tag      = 0x01 (标识 CONSTANT_Utf8_info)
length   = 0x000D (字符串的字节长度为 13)
bytes    = 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 ("Hello, World!" 的 UTF-8 编码)

常量池通常分为下面几种常量值类型:

类型标志(tag)描述
CONSTANT_Utf8_info1UTF-8编码的字符串
CONSTANT_Integer_info3整型字面量
CONSTANT_Float_info4浮点型字面
CONSTANT_Long_info5长整型字面量
CONSTANT_Double_info6双精度浮点型字面量
CONSTANT_Class_info7类或接口的符号引用
CONSTANT_String_info8字符串类型字面量
CONSTANT_Fieldref_info9字段的符号引用
CONSTANT_Methodref_info10类中方法的符号引用
CONSTANT_InterfaceMethodref_info11接口中方法的符号引用
CONSTANT_NameAndType_info12字段或方法的部分符号引用
CONSTANT_MethodHandle_info15表示方法句柄
CONSTANT_MethodType_info16表示方法类型
CONSTANT_InvokeDynamic_info18表示一个动态方法调用点

附录-访问标识表

项目Value
ACC_PUBLIC 0x0001是否是public类型
ACC_FINAL 0x0010是否是NULL
ACC_SUPER 0x0020该标志必须为真
ACC_INTERFACE 0x0200是否为接口
ACC_ABSTRACT 0X0400是否是接口或者抽象类
ACC_SYNTHETIC 0x1000编译器自动生成,非用户代码产生
ACC_ANNOTATION 0x2000是否为注解
ACC_ENUM 0x4000是否为枚举

附录-常量池类型列表

常量类型tag值描述
CONSTANT_Utf8_info1用于存储 UTF-8 编码的字符串
CONSTANT_Integer_info3用于存储 4 字节的整型字面量(int
CONSTANT_Float_info4用于存储 4 字节的浮点型字面量(float
CONSTANT_Long_info5用于存储 8 字节的长整型字面量(long
CONSTANT_Double_info6用于存储 8 字节的双精度浮点型字面量(double
CONSTANT_Class_info7用于存储类或接口的符号引用,引用 CONSTANT_Utf8_info 中的类名
CONSTANT_String_info8用于存储字符串字面量,引用 CONSTANT_Utf8_info 中的字符串内容
CONSTANT_Fieldref_info9用于存储字段的符号引用,引用类和字段的描述信息
CONSTANT_Methodref_info10用于存储类中方法的符号引用,引用类和方法的描述信息
CONSTANT_InterfaceMethodref_info11用于存储接口中方法的符号引用,引用接口和方法的描述信息
CONSTANT_NameAndType_info12用于描述字段或方法的名称和类型,引用名称(Utf8)和描述符(Utf8
CONSTANT_MethodHandle_info15用于存储对方法句柄的引用(invokedynamic 指令用)
CONSTANT_MethodType_info16用于存储方法类型的符号引用,指向方法描述符(Utf8
CONSTANT_Dynamic_info17用于存储动态调用点的信息(JDK 11 引入,支持动态常量)
CONSTANT_InvokeDynamic_info18用于存储动态方法调用点的信息,引用引导方法和动态调用名称
CONSTANT_Module_info19用于存储模块的符号引用(JDK 9 引入)
CONSTANT_Package_info20用于存储包的符号引用(JDK 9 引入)

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

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

相关文章

已存大量数据的mysql库实现主从各种报错----解决方案(看评论)

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建,使…

数据结构 【双向哨兵位循环链表】

链表的结构分为8中,其实搞懂了单链表和双向哨兵位循环链表,这部分的知识也就掌握的差不多了。双向哨兵位循环链表的结构如下: 下面我从0构建一个双向哨兵位循环链表。 1、准备工作 构建节点结构体,双向循环链表的每一个…

高级AI记录笔记(五)

学习位置 B站位置:红豆丨泥 UE AI 教程原作者Youtube位置:https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 改良近战AI格挡行为 把近战AI的格挡行为从行为树中单独一个任务分块中给删除掉,因为我们希望敌人在受到伤害后立即进行…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时,中文字符的显示常常会出现乱码问题,尤其在 macOS 系统上。在网上找了一大堆方法,花了很久,发现不是要安装各种字体就是要改配置&…

11.25.2024刷华为OD

文章目录 HJ76 尼科彻斯定理(观察题,不难)HJ77 火车进站(DFS)HJ91 走格子方法,(动态规划,递归,有代表性)HJ93 数组分组(递归)语法知识…

突破性算法:让无人机集群在狭窄空间内穿针引线

导读 在建筑救援、森林搜索等任务中,无人机集群经常会遇到狭窄空间限制和动态障碍物变化等挑战。这些挑战会导致集群内部冲突,或在执行任务时因避让动态障碍物而导致系统混乱。实际应用场景和任务的严格特征往往使得全局搜索难以优化,而局部避…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

【Shell】运维快捷键及shell各种不同实际运维场景

一,控制台使用技巧 1,操作快捷键 Ctrlr :可以快速查找历史命令 Ctrll :可以清理控制台屏幕 Ctrla \ Ctrle :移动光标到命令行首\行尾 Ctrlw \ Ctrlk :删除光标之前\之后的内容 2,VIM文件编辑快捷键 快捷键ZZ :文件保存并退出 3&#xff…

SlickGrid复选框

分析 1、先在columns首列添加复选框; 2、在SlickGrid注册刚添加的复选框; 3、添加复选框变化事件; 4、注册按钮点击事件,点击获取已选中的行。 展示 代码 复选框样式(CSS) .slick-cell-checkboxsel {bac…

基于单片机的智慧小区人脸识别门禁系统

本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集,识别成功后,舵机模块动作,模拟门禁打开,门…

【小白学机器学习33】 大数定律python的 pandas.Dataframe 和 pandas.Series基础内容

目录 0 总结 0.1pd.Dataframe有一个比较麻烦琐碎的地方,就是引号 和括号 0.2 pd.Dataframe关于括号的原则 0.3 分清楚几个数据类型和对应的方法的范围 0.4 几个数据结构的构造关系 list → np.array(list) → pd.Series(np.array)/pd.Dataframe 1 python 里…

Edge浏览器保留数据,无损降级退回老版本+禁止更新教程(适用于Chrome)

3 个月前阿虚就已经写文章告警过大家,Chromium 内核的浏览器将在 127 以上版本开始限制仍在使用 Manifest V2 规范的扩展:https://mp.weixin.qq.com/s/v1gINxg5vMh86kdOOmqc6A 像是 IDM、油猴脚本管理器、uBblock 等扩展都会受到影响,后续将无…

基于Spring Boot的装饰工程管理系统论文

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统装饰工程项目信息管理难度大,容错率低&#x…

路由器的工作原理

网络拓扑结构 主机A: IP地址:10.1.0.1/16 MAC地址:MACA 主机B: IP地址:10.2.0.1/16 MAC地址:MACB 网关G0/0/0: IP地址:10.1.0.2/16 MAC地址:MACC 网关G0/0/1&#…

【深度学习|特征增强模块】FFN(前馈神经网络)和E_FFN(增强型前馈神经网络)是transformer特征增强的重要组成部分!

【深度学习|特征增强模块】FFN(前馈神经网络)和E_FFN(增强型前馈神经网络)是transformer特征增强的重要组成部分! 【深度学习|特征增强模块】FFN(前馈神经网络)和E_FFN(增强型前馈神…

51单片机从入门到精通:理论与实践指南(一)

单片机在智能控制领域的应用已非常普遍,发展也很迅猛,学习和使用单片机的人员越来越多。虽然新型微控制器在不断推出,但51单片机价格低廉、易学易用、性能成熟,在家电和工业控制中有一定的应用,而且学好了51单片机&…

java写一个石头剪刀布小游戏

石头剪刀布是一款经典的手势游戏,通常由两人参与,玩法简单且充满趣味。玩家通过出示手势代表“石头”、“剪刀”或“布”,并根据规则比较手势决定胜负。它广泛用于休闲娱乐、决策或解压活动。 一、功能简介 用户与计算机对战。 用户输入选择:石头、剪刀或布。 计算机随机生…

MATLAB深度学习(六)——LSTM长短期神经网络原理与应用

LSTM的应用可以参见一个相当好的视频:小车倒立摆最优控制教程 - Part1 Simulink Simscape Multibody仿真建模_哔哩哔哩_bilibili 6.1 序列建模——循环神经网络 循环神经网络RNN是一类专门用于处理序列性数据x,,xn的神经网络结构&#xff0c…

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术,广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性,通过对当前数据的预测和实际值与预测值之间的差值进行编码,从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…

第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2024)

重要信息 会议官网:itca2024.iaecst.org 会议时间:2024年12月06-08日 会议地点:中国-广州(越秀国际会议中心) 会议简介 第六届信息技术与计算机应用学术会议(ITCA 2024) 依旧作为第六届国际科技创新学术交流大会…