Class文件的结构其实也很简单,主要可通过下面的数据结构表示
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
每个java源代码都会生成对应的class文件,文件中最重要的当属constant_pool了,不过首先还是说一下描述符。
A 描述符
Java源代码中有方法、类、域(即成员变量或类变量)几种,这些在Class文件中都有对应的描述符进行描述。例如:
Object method(int i,double d,Thread t)
对应的描述符为:
(IDLjava/lang/Thread;)LJava/Object
格式为(参数描述符*)返回描述符,可以看到函数名称在其中并没有出现。
B 常量池
有了描述符就可以在常量池中对它进行索引了。例如在常量池中包含一种数据结构:
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index;
u2 descriptor_index;
}
用于描述域和方法的
其中descriptor_index会索引到一个Constant_Utf8的字符串,这个字符串可能就是前面所说的"(IDLjava/lang/Thread;)LJava/Object"
其中name_index会索引到一个Constant_Utf8的字符串,它是这个方法或域的不完整限定名。(Thread类的完整限定名是 java.lang.Thread, 不完整限定名是Thread)
C 属性
一些的关注还需要放在attributes上,因为这个数据结构中包含了将要被执行的JVM指令代码,attributes的数据结构如下:
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
这只是一个可变的结构,对于code来说,它能演化为:
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
我们关心的code就放在code的数组中,另外我们看到了一些关于exception的信息,还有最后居然还又嵌入了attributes信息,这些信息可能是LineNumberTable或LocalVariableTable ,这些都是我们可能想知道的一些调试信息,需要在编译时加上"-g"选项。
知道了Class文件的格式就可以使用JVM加载它,并进行校验,准备和解析了,并加载运行指令
分享到:
相关推荐
【狂神说JVM探究】是一份集合了...这些知识点覆盖了JVM的基础到进阶内容,适合初学者和有一定经验的开发者深入理解Java运行机制。通过学习这份资料,读者可以系统地掌握JVM的工作原理,并提升Java应用的性能优化能力。
2. **执行引擎**:作为解释器,负责解释JVM指令并提交操作系统执行。它是Java程序运行的实际执行者,将字节码转换为机器指令。 3. **本地接口**:允许Java程序调用非Java语言编写的函数,最初旨在整合C/C++代码。...
#### 2. JVM与JRE、JDK的关系 - **JVM**:负责执行Class文件,是Java虚拟机。 - **JRE**:Java运行环境,包括JVM和Java的核心类库。 - **JDK**:Java开发工具包,包含JRE和编译、调试等开发工具。 #### 3. JVM的...
"蚂蚁课堂-JVM快速入门2"这个课程显然旨在帮助初学者迅速掌握JVM的基础知识,特别是关于JVM参数的设置和内存溢出问题的处理。 首先,我们来深入了解JVM参数。JVM参数是用来配置和调整JVM行为的关键工具。它们分为两...
2. 运行时数据区:包括程序计数器、Java虚拟机栈、本地方法栈、堆和方法区。这些区域各有不同的作用,比如存储局部变量、管理对象实例等。 3. 字节码解释器:将字节码转化为机器可执行的指令。此外,JVM还支持即时...
二、JVM诊断 1. JMX(Java Management Extensions):提供管理和监控JVM的工具,可以查看运行时的内存、线程、类装载情况等。 2. jstat:命令行工具,用于收集JVM的各种统计信息,如垃圾收集、类装载、内存使用等...
此外,文档的结构化布局使得内容条理清晰,即使是初学者也能够逐步建立起对JVM内存管理的全面认识。通过这份白皮书的学习,读者将能够深入理解JVM内存管理的复杂性,并掌握处理内存问题的有效方法。
2. **README.txt**:这是个标准的文档,提供了关于SAP JVM 4.1的基本信息、安装指南、配置建议和可能遇到的问题及解决方案。用户在安装和使用过程中应首先查阅这个文件。 3. **THIRDPARTYLICENSEREADME.txt**:这个...
2. **连接到JVM**:选择"Local"选项,VisualVM会自动检测并列出正在运行的Java进程。选择你要分析的应用进程,点击连接。 3. **监控内存和线程**:在“Memory”和“Threads”视图中,你可以看到实时的内存使用情况和...
2. **垃圾收集器模块**:Hotspot提供了多种垃圾收集器,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)。每种收集器都有其特定的适用场景和优化策略,例如,G1采用并发标记和空间整理,以...
本手册旨在为初学者提供关于 JVM 的基础知识,重点介绍 JVM 内存模型中的关键概念。 #### JVM 内存模型概览 JVM 在执行 Java 程序的过程中,将其所管理的内存划分为几个不同的区域,每个区域有其特定的功能和生命...
本资源“jvm快速入门”旨在帮助初学者快速理解JVM的工作原理,掌握其核心概念,从而在Java开发的道路上迈出坚实的步伐。下面我们将深入探讨JVM的相关知识点。 1. **JVM架构**:JVM由类装载器、运行时数据区、执行...
然而,这个简单的实现旨在帮助初学者理解JVM的基本工作原理,通过实践加深对Java字节码执行的理解。 总结来说,"JVM.rar_jvm_jvm 实现"项目是一个简化版的Java虚拟机实现,重点关注了基本的字节码解析、操作数栈的...
### 知识点总结 #### 1. 高级语言虚拟机 (JVM) 概念及...这些内容不仅对初学者友好,也为专业人士提供了深入理解JVM机制的机会。通过上述总结,读者可以更好地理解JVM的相关概念和技术细节,并应用于实际开发工作中。
Java虚拟机(JVM)规范和Java语言规范是Java开发者深入理解这个平台和技术的基石。这两部分规范分别定义了Java...无论是初学者还是经验丰富的开发者,都应该将这两个规范作为必备的参考资料,以提升自己的专业技能。
对于初学者而言,掌握JVM的基础知识不仅可以帮助深入理解Java语言的工作原理,还能为解决实际开发中遇到的问题提供强大的工具。本文旨在探讨为什么学习JVM如此重要,并分享作者撰写“JVM基础系列”专栏的初衷。 ###...
《JVM高级特性与最佳实践》第二版源代码是一份宝贵的学习资源,涵盖了Java虚拟机的深入理解和优化技巧。这份源代码提供了多个章节的内容,包括第1章至第11章,让读者能够通过实际代码深入理解JVM的工作原理和实践...
#### 二、JVM(Java虚拟机) Java虚拟机(JVM)是Java技术的核心组成部分之一,它是一个抽象的计算机,可以在任何操作系统上运行Java字节码(.class文件)。JVM的主要功能包括: 1. **字节码解释执行**:JVM负责...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。作为新手,了解JVM的工作原理和优化...对于初学者来说,这是一个很好的起点,逐步掌握JVM将有助于成为一名优秀的Java开发者。
2. **JVM简介** - JVM(Java Virtual Machine)是Java程序的运行环境,它负责执行Java字节码。 - JVM包括类加载器、运行时数据区、执行引擎等核心组件。 - 类加载器负责将.class文件加载到内存中,并转换为可供...