第三部分 虚拟机执行子系统
作者:互联网
文章目录
第6章 类文件结构
虚拟机可以载入和执行一种与平台无关的字节码,从而实现程序的“一次编写,到处运行”。
各种不同平台的虚拟机和所有平台统一使用程序存储格式–字节码(ByteCode),是构成平台无关性的基石。
实现语言无关性的是虚拟机和字节码存储格式。Java虚拟机不和任何语言绑定,只与“Class文件”这种特定的二进制文件格式所关联。
Class文件中包含Java虚拟机指令集和符号表以及若干辅助信息。使用javac编译器可以把java代码编译成存储字节码的Class文件,然后由虚拟机执行。
任何一个Class文件都对应着唯一一个类或接口的定义信息。
Class文件是一组以8位字节为基础单位的二进制流。Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,包括两种数据类型:无符号数和表
第7章 虚拟机类加载机制
7.1 概述
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
7.2 类加载的时机
加载、验证、准备、初始化、卸载这5个阶段顺序是确定的,而解析不一定,可能会在初始化之后才开始,这是为了支持java语言的运行时绑定(动态绑定)。
//被动引用演示一:通过子类引用父类的静态字段,不会导致子类初始化
public class SuperClass{
static{
System.out.println("SuperClass init!");
}
public static int value = 1;
}
public class SubClass{
static{
System.out.println("SubClass init!");
}
}
public class NonInitialization{
publid static void main(String[] args){
System.out.println(SubClass.value);
}
}
//被动引用演示二:通过数组定义来引用类,不会触发此类的初始化
public class NonInitialization{
publid static void main(String[] args){
SuperClass[] sca = new SuperClass[10];
}
}
//被动引用演示三: 常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
public class ConstClass{
static{
System.out.println("ConstClass init!");
}
public static final String HELLOWORLD = "hello world";
}
public class NonInitialization{
publid static void main(String[] args){
System.out.println(ConstClass.HELLOWORLD);
}
}
7.3 类加载的过程
7.3.1 加载
1)通过一个类的全限定名来获取定义此类的二进制流
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
7.3.2 验证
验证是连接阶段的第一步,为了确保Class文件的字节流中包含的信息符合虚拟机的要求。
7.3.3 准备
准备阶段是正式为类变量(被static修饰的变量)分配内存并设置类变量初始值的阶段
7.3.4 解析
解析阶段是虚拟机将常量池内的符号引用替换成直接引用的过程。
7.3.5 初始化
7.4 类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这一动作放到java虚拟机外部去是实现,以便让程序自己决定如何获取所需要的类。实现这个动作的代码块叫类加载器。
7.4.1 类与类加载器
比较两个类是否相等,只有在这两个类时在同一个类加载器加载的前提下才有意义,这里的相等,包括代表类的Class对象的equals()方法、isInstance()方法返回的结果
第9章 类加载及执行子系统的案例和实战
9.1 概述
在Class文件格式与执行引擎这部分中,用户的程序能直接影响的内容并不太多,Class文件以何种格式存储,类型和时加载、如何连接,以及虚拟机如何执行字节码指令等都是由虚拟机直接控制的行为。能通过程序操作的,主要是字节码生成与类加载器这两部分的功能。
9.2 案例
9.2.1 Tomcat: 正统的类加载器架构
主流的java Web服务器,如Tomcat,Jetty等都实现了自己的类加载器。因为一个功能健全的Web服务器,要解决如下问题:
- 部署在同一个服务器上的两个Web应用程序所使用的java类库可以实现相互隔离。
- 部署在同一个服务器上的两个Web应用程序所使用的java类库可以共享。
- 服务器需要尽可能的保证自身的安全部首部署的Web应用程序影响。
- 支持JSP应用的Web服务器,大多数需要支持HotSwap功能。
标签:字节,虚拟机,子系统,7.3,static,第三,Class,加载 来源: https://blog.csdn.net/weixin_46590256/article/details/121755294