JVM(Java虚拟机)笔记
ClassLoader(类加载器)
JVM关闭:System.exit()、正常结束、异常、系统底层错误,虚拟机进程中止
类加载顺序:
加载:二进制文件à内存的过程,方法区(封装类的数据结构)/堆区(Class对象,提供访问方法区数据结构的接口)
连接
(
验证:合并到虚拟机的运行环境,结构检查(.class文件的固定格式);语义(语法规定);字节码(安全检查);二进制兼容(相互引用之间协调一致,NoSuchMethodError)
准备:静态变量赋值类型初始值
解析:符号引用(引用其他类的方法)转变为直接引用(指针)
)
初始化(首次主动使用):赋自定的初始值;未加载和连接à加载连接;未初始化直接父类à初始化直接父类;存在初始化语句à依次执行初始化语句
(特殊情况:如果访问的是静态常量,此常量是编译常量,类不会初始化)
(特殊情况:虚拟机初始化一个类时,要求所有父类都初始化,初始化一个类时,不会初始化它所实现的接口,初始化一个接口,不会先初始化父接口)
(特殊情况:对于接口,首次使用特定接口的静态变量,才会初始化此接口)
(特殊情况:对父类主动使用,不会导致子类被初始化,eg,Object类)
(特殊情况:变量定义在父类,对子类主动使用,不初始化子类)
(特殊情况:loadClass方法加载一个类,不是主动使用,不会初始化)
主动使用(6种):创建实例、访问静态变量,调用静态方法,反射,初始化子类,设置启动类
JVM自带类加载器:
Bootstrap:c++实现,getClassLoader方法返回null
Extension:扩展类加载器
System(Application):系统类加载器
自定义
ClassLoader的子类
父亲委托机制
父子加载器的关系不是继承关系,是组合关系
定义类加载器:成功加载某类;初始类加载器:能返回Class引用的所有加载器
命名空间:由加载器和所有父加载器加载的类组成
运行时包:包名相同;定义类加载器一致的(eg,为了安全,防止java.lang.Liucheng和java.lang.*的情况发生)
类的卸载
类的Class实例和类加载器对象是双向关联。
Class实例和类加载器互不指向,类会被卸载。