JVM(Java虚拟机)笔记

来源:互联网 发布:雷霆战机网络连接超时 编辑:程序博客网 时间:2024/04/29 05:36

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实例和类加载器互不指向,类会被卸载。

0 0