1、类的载入、链接和初始化 css
类初始化一般包含载入、链接、初始化三个步骤。html
(1)进程的结束java
每当执行一个java程序时,将会启动一个java虚拟机进程,不管程序多么复杂。有多少线程。都在这个java虚拟机进程里。下面四种状况会使得该进程被终止——bootstrap
当该进程结束,那么该进程在内存中的状态将会丢失。包含静态变量的值。缓存
(2)类的载入jvm
类的载入是指将类的class文件读入内存。并为之建立一个java.lang.class对象。post
(3)类的链接spa
类的链接负责把类的二进制数据合并到JRE中,分为三个阶段——线程
(4)类的初始化xml
类的初始化。主要就是对静态Field进行初始化。
2、类载入器
(1)类载入器简单介绍
类载入器负责载入所有的类。系统为所有载入内存里的类都会生成一个java.lang.class对象。
同一个类仅仅会被载入一次,在JVM中每一个不一样的类都会有一个不一样的类载入器负责。
类载入器在不包含用户本身定义的载入器的状况下包含三层:
①根载入器,又称为引导或者原始载入器,负责载入java的核心类;
②扩展类载入器,负责载入JRE的扩展文件夹中JAR包的类。
③系统类载入器。又称为应用载入器。负责JVM启动时载入来自java命令的-classpath或者CLASSPATH环境变量所指定的JAR包和类路径。一般是程序执行的当前路径。因此其称为应用类载入器。
三个类载入器的顺序是:
bootstrap classloader
|
extension classloader
|
system classloader
假设实用户本身定义的类载入器,那么在系统载入器后。将会执行用户类载入器。
(2)本身定义类载入器
假设咱们需要在启动类载入时做一些特定需求的行为,那么就需要本身定义类载入器了。
本身定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这种方法定义了ClassLoader查找class的方式。
主要可以扩展的方法有:
findClass 定义查找Class的方式
defineClass 将类文件字节码载入为jvm中的class
findResource 定义查找资源的方式
(3)类载入机制
JVM的类载入机制有下面三种:
所谓全盘负责。便是当一个classloader载入一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另一个classloader载入。
所谓父类托付。就是先让父类载入器先尝试载入该Class,当父类没法载入的时候。才是尝试从本身的类路径中去载入。
JVM的ClassLoader採用的是树形结构,除了BootstrapClassLoader之外。每一个ClassLoader都会有一个parentClassLoader,即父类载入器,用户本身定义的ClassLoader默认的parendClassLoader是SystemClassLoader,固然你可以本身指定需要用哪个ClassLoader的实例
所谓缓存机制就是保证所有载入过的类都会被缓存。当程序中需要某个类时,会先从缓存区中搜查该类,当缓存区不存在该类对象时,系统才会读取该类的二进制文件。