JVM: java virtual machine
java 虚拟机 ,是一个虚构出来的机器,通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java虚拟机有自己完善的硬件架构,如:处理器,堆栈,寄存器等,还具有相应的指令系统。
JVM屏蔽了与具体操作系统平台相关的信息,使得java程序只需生成在jvm上运行的目标代码(字节码),就可以在多种平台上不加修改的运行。
字节码:通常是指已经经过编译,但与特定机器码无关,需要直译器转译后才成成为机器码的中间代码。
字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
字节码主要为了实现特定软件运行和软件环境,硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。
编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转义为可以直接执行的指令,字节码典型的应用是java语言。
在java里面是java文件编译后的class文件
源码---> 编译器---->字节码---->虚拟机---->机器码--->运行
class文件的格式:
ClassFile {
u4 magic;---------------------------------------->每个class文件的前4个字节被称为他的魔数(magic number):0xCAFEBABE,魔数的作用在于可以轻松的分辨出java class和非java class文件。
u2 minor_version;-------------------------------->次版本号
u2 major_version;-------------------------------->主版本号,通常只有定了主版本号和一系列的此版本号之后,JVM才会读取Class文件。如果Class文件的版本号超出了JVM的处理范围,JVM不会处理该文件。
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];
}