今天工作有点忙,没时间学习了,赶紧补上吧。
昨天开始学习class文件结构,今天继续。
一、class类文件结构
Class文件是一组以8位字节为基础单位的二进制流。
根据java虚拟机的规定,Class文件格式采用一种类似于C语言结构体的微结构来存储,这种伪结构只有两种数据类型:无符号数和表。
1、魔数与Class文件的版本,下面是从ue中拷贝出来的十六进制片段
package com.struts.action;
public class TestClass {
private int m;
public int inc(){
return m+1;
}
}
00000000h: CA FE BA BE 00 00 00 32 00 16 07 00 02 01 00 1B ; 漱壕...2........
00000010h: 63 6F 6D 2F 73 74 72 75 74 73 2F 61 63 74 69 6F ; com/struts/actio
00000020h: 6E 2F 54 65 73 74 43 6C 61 73 73 07 00 04 01 00 ; n/TestClass.....
00000030h: 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 ; .java/lang/Objec
00000040h: 74 01 00 01 6D 01 00 01 49 01 00 06 3C 69 6E 69 ; t...m...I...<ini
00000050h: 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 0A ; t>...()V...Code.
00000060h: 00 03 00 0B 0C 00 07 00 08 01 00 0F 4C 69 6E 65 ; ............Line
00000070h: 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 12 4C 6F ; NumberTable...Lo
00000080h: 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 ; calVariableTable
00000090h: 01 00 04 74 68 69 73 01 00 1D 4C 63 6F 6D 2F 73 ; ...this...Lcom/s
000000a0h: 74 72 75 74 73 2F 61 63 74 69 6F 6E 2F 54 65 73 ; truts/action/Tes
000000b0h: 74 43 6C 61 73 73 3B 01 00 03 69 6E 63 01 00 03 ; tClass;...inc...
000000c0h: 28 29 49 09 00 01 00 13 0C 00 05 00 06 01 00 0A ; ()I.............
000000d0h: 53 6F 75 72 63 65 46 69 6C 65 01 00 0E 54 65 73 ; SourceFile...Tes
000000e0h: 74 43 6C 61 73 73 2E 6A 61 76 61 00 21 00 01 00 ; tClass.java.!...
000000f0h: 03 00 00 00 01 00 02 00 05 00 06 00 00 00 02 00 ; ................
00000100h: 01 00 07 00 08 00 01 00 09 00 00 00 2F 00 01 00 ; ............/...
00000110h: 01 00 00 00 05 2A B7 00 0A B1 00 00 00 02 00 0C ; .....*?.?.....
00000120h: 00 00 00 06 00 01 00 00 00 03 00 0D 00 00 00 0C ; ................
00000130h: 00 01 00 00 00 05 00 0E 00 0F 00 00 00 01 00 10 ; ................
00000140h: 00 11 00 01 00 09 00 00 00 31 00 02 00 01 00 00 ; .........1......
00000150h: 00 07 2A B4 00 12 04 60 AC 00 00 00 02 00 0C 00 ; ..*?..`?......
00000160h: 00 00 06 00 01 00 00 00 07 00 0D 00 00 00 0C 00 ; ................
00000170h: 01 00 00 00 07 00 0E 00 0F 00 00 00 01 00 14 00 ; ................
00000180h: 00 00 02 00 15 ; .....
每个Class文件的头4个字节成为魔数,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件,很多文件标准都采用魔数身份识别,使用魔数而不是扩展名主要是为了安全考虑,因为文件扩展名可以被随意的改动。
哈哈,发现一件很有意思的事情,class文件的前四个字节是 0xCAFEBABE(咖啡宝贝)。
我们来分析一行Class文件用ue打开后的十六进制内容吧:
CA FE BA BE 00 00 00 32
前四个字节标示它是Class格式的,第五和第六标示次版本号,而主版本号的值为0x0032,即十进制的50,该版本号说明这个是可以被jdk1.6以上版本的虚拟机执行的Class文件。
2、常量池
常量池紧跟在主次版本之后,由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,也就是两个字节的数据,代表常量池计数值。0x0016,即十进制的22,代表常量池中有21项常量。
常量池中主要存放两大类常量:字面量和符号引用,字面量比较接近java语言层面的常量概念,如文本字符串,被生命为final的常量值等,而符号引用则属于编译原理方面的概念,包括下面三类:
(1)类和接口的全限定名
(2)字段的名称和描述符
(3)方法的名称和描述符
其它的推倒就不再累述,也没有细看,总之,十六进制格式字符对应前面所说的表里面的数据,都是有意义的,最终都可以翻译成原生的java文件。
二、虚拟机类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
在java语言里面,类型的加载和连接过程都是在程序运行期间完成的,这样会在类加载时稍微增加一点开销,但是却能为java应用程序提供高度的灵活性,java中天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载,验证、准备、解析、初始化、使用和卸载七个阶段。其中验证准备和解析统称为连接。
对于初始化阶段,虚拟机规定了有且只有这四种情况,需要对类进行初始化(加载,验证,准备自然需要在此之前开始)
(1)遇到new、getstatic、putstatic或invokestatic这四条指令码,生成这四条指令码最常见的java代码场景是:使用new关键字实例化对象、读取或设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外),以及调用一个类的静态方法的时候。
(2)使用java.lang.reflect包的方法对类进行反射调用的时候
(3)当初始化一个类的时候,如果发现父类还没有进行初始化,则需要先出发其父类的初始化
(4)当虚拟机启动时,用户需要指定一个要执行的主类(包括main()方法那个类),虚拟机会先初始化这个主类。
分享到:
相关推荐
### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在深入探讨JVM之前,我们先要理解Java编程语言的...通过学习和实践,我们可以更好地理解和优化JVM,提升Java应用的整体性能。
- `THIRDPARTYLICENSEREADME.txt`:列出了所有第三方库的许可协议,这对于遵循开源软件许可非常重要。 - `buildinfo.txt`:提供了关于构建过程的信息,如编译日期、版本号等,有助于诊断问题或确定软件的构建状态...
对于前四个本地变量可以采用iload_0,iload_1,iload_2,iload_3(它们分别表示第0,1,2,3个整形变量)这种不到参数的简化命令形式。对于第4以上的本地变量将使用iload命令这种形式,在它后面给一参数,以表示是对第几个...
这本书的第二版更是加入了更多最新的JVM特性,使得学习内容更加全面且贴近实际。配套的源代码提供了丰富的实践机会,让理论知识与实战结合,使学习更加有效。 首先,我们要了解JVM(Java Virtual Machine)是Java...
第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集...
- **THIRDPARTYLICENSEREADME.txt**:列出SAP JVM可能依赖的第三方库及其许可信息,对于合规使用软件非常重要。 - **buildinfo.txt**:提供了关于SAP JVM构建过程的详细信息,如版本、编译日期和构建参数等。 - *...
6. 可扩展性:JVM提供了强大的扩展能力,Java类库和第三方库可以提供各种功能来增强JVM的性能和特性。例如,通过Java Native Interface(JNI)技术,可以调用本地(非Java)代码来扩展JVM的功能。 而在Java特性方面...
第三章:垃圾回收 1. 如何判断对象可以回收 2. 垃圾回收算法 3. 分代垃圾回收 4. 垃圾回收器 5. 垃圾回收调优 第四章:类加载与字节码技术 1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6...
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机(JVM)技术的书籍,其源代码提供了丰富的实践案例和示例,帮助读者更直观地理解JVM的工作原理和优化技巧。以下是根据书名和描述所涉及的一些关键知识点...
3. **第3章:JVM内存管理** - 关注JVM的堆内存、栈内存、方法区等区域的分配和回收。可能包括垃圾收集算法(如 Minor GC, Major GC, Full GC)的实现示例,以及如何调整内存参数以优化性能。 4. **第4章:JVM字节码...
第三节“了解JVM参数”可能涵盖了如何查看当前JVM配置,如何通过命令行参数调整JVM设置,以及不同参数对程序性能的影响。这部分内容可能包括了垃圾收集器的选择,如Serial、Parallel、CMS或G1,以及它们在不同场景下...
1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初代JVM性能较低,但具备“一次编写,到处运行”的跨平台特性。 2. **HotSpot VM**:...
接着,手册详细列举了JVM的三大类参数,并对它们的功能和用法进行了解释: 1. 标准参数:以“-”开头,如“-server”、“-client”,这些参数在所有JVM实现中都是一致的,用于设置JVM的运行模式等基础功能。标准...
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》是一本针对Java开发者深入解析JVM机制的权威指南。本书主要涵盖了Java虚拟机的高级特性及其最佳实践,旨在帮助开发者优化程序性能,提升系统稳定性。在...
学习 JVM 主要有三个原因:面试的需要、中高级程序员必备技能和追求极客的精神。面试中,面试官经常会问一些 JVM 相关的问题,如垃圾回收算法、JIT 等。中高级程序员需要掌握 JVM 的知识,以便更好地调优程序和解决...
学习JVM的第一天,我们首先要理解JVM(Java Virtual Machine)与JRE(Java Runtime Environment)和JDK(Java Standard Edition Development Kit)的关系。JVM是执行Java程序的核心虚拟机,负责解释和执行字节码。...
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机的专著,涵盖了JVM的重要概念、特性和优化策略。这本书旨在帮助开发者理解和掌握JVM的工作原理,从而提升Java应用程序的性能和稳定性。源码的提供则使得...
3. **JIT编译器(Just-In-Time Compiler)**:HotSpot JVM 使用 JIT 编译器将运行时经常执行的字节码转化为机器码,以提高执行效率。C1 和 C2 是 HotSpot 中的两种 JIT 编译器,分别处理简单的和复杂的代码优化。 4...