ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第三部分 虚拟机执行子系统

2021-12-07 19:34:18  阅读:165  来源: 互联网

标签:字节 虚拟机 子系统 7.3 static 第三 Class 加载


文章目录

第6章 类文件结构

虚拟机可以载入和执行一种与平台无关的字节码,从而实现程序的“一次编写,到处运行”。
各种不同平台的虚拟机和所有平台统一使用程序存储格式–字节码(ByteCode),是构成平台无关性的基石。
实现语言无关性的是虚拟机和字节码存储格式。Java虚拟机不和任何语言绑定,只与“Class文件”这种特定的二进制文件格式所关联。

Class文件中包含Java虚拟机指令集和符号表以及若干辅助信息。使用javac编译器可以把java代码编译成存储字节码的Class文件,然后由虚拟机执行。
任何一个Class文件都对应着唯一一个类或接口的定义信息。
Class文件是一组以8位字节为基础单位的二进制流。Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,包括两种数据类型:无符号数和表

第7章 虚拟机类加载机制

7.1 概述

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制

7.2 类加载的时机

类的生命周期
加载、验证、准备、初始化、卸载这5个阶段顺序是确定的,而解析不一定,可能会在初始化之后才开始,这是为了支持java语言的运行时绑定(动态绑定)。
必须对类立即初始化的4种情况

//被动引用演示一:通过子类引用父类的静态字段,不会导致子类初始化
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有