Java虚拟机知识点-class文件

简介: Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙。

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙。当遇到需要占用8位字节以上的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储。
image

ClassFile 结构说明
magic:魔数。唯一作用是确定这个文件是否为一个能被虚拟机所接收的class文件。固定值:0xCAFEBABE。
minor_version:class文件的副版本号。
major_version:class文件的主版本号。
constant_pool_count:常量池计数器。
constant_pool[constant_pool_count]:常量池。包含字符串常量、类或接口名、字段名和其他常量。常量池每一项都具备相同特征,即第一个字节作为类型标记,用来确定该项格式。
access_flags:访问标志。用于表示某个类或接口的访问权限及属性。
this_class:当前的类索引。
super_class:父类索引。
interfaces_count:接口计数器。当前类或接口的直接超的接口数量。
interfaces[interfaces_count]:接口表。
fields_count:字段计数器。当前class文件的字段成员个数。
fields[fields_count]:字段表。
methods_count:方法计数器。方法的个数。
methods[methods_count]:方法表。
attributes_count:属性计数器。属性个数。
attributes[attributes_count]:属性表。
一个例子
对下面的类进行编译生成 Test2.class 。

public class Test2 {

public static int i = 1;
public static void main() {
    System.out.println(i);
}

}
通过十六进制查看工具打开 Test2.class 。

image

根据 ClassFile 结构说明,前面4个字节是魔数oxcafebabe。接下来是次版本号和主版本号ox0000和ox0034,十进制为0和52,52表示JDK1.8,所以JDK版本是1.8.0。

还可以使用Java自带的反编译工具来解析字节码文件。命令 javap -v Test2.class 。

Classfile /E:/CODE/JVM/Test2.class
Last modified 2019-7-19; size 219 bytes
MD5 checksum 841c66674d71005bc6a97fe6c3b0fb1d
Compiled from "Test2.java"
public class Test2
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #4.#13 // java/lang/Object."":()V
#2 = Fieldref #3.#14 // Test2.i:I
#3 = Class #15 // Test2
#4 = Class #16 // java/lang/Object
#5 = Utf8 i
#6 = Utf8 I
#7 = Utf8
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 SourceFile
#12 = Utf8 Test2.java
#13 = NameAndType #7:#8 // "":()V
#14 = NameAndType #5:#6 // i:I
#15 = Utf8 Test2
#16 = Utf8 java/lang/Object
{
public int i;

descriptor: I
flags: ACC_PUBLIC

public Test2();

descriptor: ()V
flags: ACC_PUBLIC
Code:
  stack=2, locals=1, args_size=1
     0: aload_0
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: aload_0
     5: iconst_1
     6: putfield      #2                  // Field i:I
     9: return
  LineNumberTable:
    line 1: 0
    line 2: 4

}
SourceFile: "Test2.java"
Java虚拟机限制
每个类或接口的常量池最多65535个。
类或接口中可声明的字段数最多65535个。
类或接口中可声明的方法数最多65535个。
类或接口的直接父类接口最多65535个。
方法调用时创建的栈帧,其局部变量表中的最大局部变量数位65535个。
方法帧中操作数栈的最大深度为65535。
方法的参数最多255个。
字段和方法名称、字段和方法描述符以及其他常量字符串值的最大长度为65535个字符。
数组的维度最大为255维。
喜欢这篇文章的可以给笔者点个赞同,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
6天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
53 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
27天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
56 13
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
45 3
|
2月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
129 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
71 4