1.ClassLoader(类加载器)
2.Java虚拟机与程序的声明周期,在如下几种情况下,java虚拟机将结束生命周期
a) 执行了System.exit()方法。
b) 程序正常执行结束
c) 程序在执行过程中遇到了异常或者错误而异常终止
d) 由于操作系统出现错误而导致java虚拟机进程终止
3.类的加载、连接与初始化
a) 加载:查找并加载类的二进制数据
b) 连接
i. 验证:确保被加载的类的正确性
ii. 准备:为类的静态变量分配内存,并将其初始化为默认值
iii. 解析:把类中的符号引用转换为直接引用
c)初始化:为类的静态变量赋予正确的初始值
4.java程序对类的使用方式分为两种
a) 主动使用
b) 被动使用
所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们。
5.主动使用(六种) 其他情况为被动使用(都不会导致类的初始化)
a) 创建类的实例
new Test();
b) 访问某个类或接口的静态变量,或者对该静态变量赋值
int b= Test.a
c) 调用类的静态方法
Test.doSomething();
d) 反射(如Class.forName("com.suny.Test"))
e) 初始化一个类的子类
class Parent
{
}
class Child extends Parent
{
Public static int a =3;
}
Child.a = 4;
f) Java虚拟机启动时被标明为启动类的类(Java Test)
Test.java
Test.class ,Parent.class,Child.class
Java Test
6.类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构
7.加载.class文件的方式
a) 从本地系统中直接加载
b) 通过网络下载.class文件 URLClassLoader
c) 从zip,jar等归档文件中加载.class文件
d) 从专有数据库中提取.class文件
e) 将java源文件动态编译为.class文件
8.类的加载的最终铲平是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口。
9.有两种类型的类的加载器
a) Java虚拟机自带的加载器
i. 根类加载器(Bootstrap)(使用C++编写,程序员无法在java代码中获得该类)
ii. 扩展类加载器(Extension)使用java代码实现
iii. 系统类加载器(System)(应用加载器)使用java代码实现
b)用户自定义的类加载器
i. java.lang.ClassLoader的子类
ii. 用户可以指定类的加载方式
10.JVM规范允许类加载器在预料到某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)。如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。
11.类被加载后,就进入到连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
12.类的初始化步骤
a) 加入这个类还没有被加载和连接,那么就先进行加载和连接
b) 加入类存在直接的父类,并且这个父类还没有被初始化,那么就先初始化直接的父类。
c) 加入类中存在初始化语句,那就一次执行这些初始化语句。
13.程序中对子类的“主动使用”会导致父类被初始化;但对父类的“主动使用”并不会导致子类初始化(不可能说生成一个Object类的对象就导致系统中所有的子类都被初始化)
14.只有程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用
15.类加载器的父亲委托机制(Parent Delegation)
16.父类加载器并非继承关系,也就是说子加载器不一定是继承了父加载器。
17.JVM自带的的类加载器之间的关系
18.定义类加载器:如果某个类加载器能够加载一个类,那么该类加载器就称作:定义类加载器;定义类加载器及所有子加载器都称作:初始类加载器
19.当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统加载器就将为该类加载器的父加载器。