02_类加载子系统

类加载器及类加载过程

 

类加载器子系统作用

                                   

  • 类加载器子系统负责从文件系统或网络中加载Class文件,Class文件在文件开头有特定的文件标识
  • ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
  • 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。

类加载器(ClassLoader)角色

                                                

  • class file存放在本地硬盘上。
  • class file 加载到JVM中,被称为DNA元数据模板,放在方法区。
  • 在.class文件-->JVM-->最终成为元数据模板,此过程就需要一个运输工具(Class Loader),扮演一个运输员的角色。

类的加载过程(整体加载过程,包括加载、链接、初始化)

                                       

加载

1.通过一个类的全限定名获取定义此类的二进制字节流。

2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

加载.class文件的方式:

  • 从本地系统直接加载
  • 通过网络获取
  • 从zip压缩包中读取,称为日后jar、war格式的基础
  • 运行时计算生成,使用最多的是:动态代理技术
  • 从其他文件生成,典型场景:JSP应用
  • 从专有数据库中提取
  • 从加密文件获取,典型的防Class文件被反编译的保护措施。

链接

验证

  • 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确新,不会危害虚拟机自身安全。
  • 主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证。

准备

  • 为类变量分配内存并设置该变量的默认初始值,即零值。
  • 这里不包括用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化。
  • 这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量会随着对象一起分配到Java堆中。

解析

 

posted @ 2021-03-31 00:38  HickeyZhang  阅读(69)  评论(0)    收藏  举报