JVM类加载机制


image-20200731120844528

类的加载过程

类的加载过程分为加载,验证,准备,解析,初始化共5个阶段

类的生命周期加上使用,卸载共7个阶段

加载

将字节码转换为二进制字节流加载到内存中,然后生成一个Class对象,用于类数据的访问

验证

保证字节流通过JVM规范校验和代码逻辑校验。

准备

为静态变量分配内存并设置初始值

设置初始值:

  • 若使用static修饰的静态变量,初始化皆为零值
  • 若使用static final 修饰的静态变量,初始化即为代码设置的值

解析

将常量池中的符号引用替换成直接引用。

初始化

初始化的条件

  • 虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类
  • 通过new,反射创建一个对象时,会触发类的初始化
  • 调用一个类的静态方法时会触发类的初始化(invokestatic)
  • 调用静态变量或者给静态变量赋值时会触发类的初始化(getstatic,putstatic)
  • 初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化

初始化代码的规律:

父类静态>子类静态>父类非静态,构造器>子类非静态,构造器

参考这篇文章:两道面试题,带你解析Java类加载机制

类加载器的分类

  • 启动类加载器:加载JDK核心类库,位于JAVA_HOME\lib
  • 扩展类加载器:加载Java的扩展类库,位于JAVA_HOME\lib\ext
  • 应用程序类加载器:加载程序员写的Java类

双亲委派模型

双亲委派模型机制:收到类的加载请求时,优先委派给父类加载器加载,如果父类无法加载,再由子类加载。故最终的加载顺序都是优先给启动类加载器加载,再由扩展类加载器加载,依次类推。

目的:避免类的重复加载

【举个例子】每个类都有一个共同的父类Object,每个类在被加载时都会先去加载Object类,按照双亲委派模型的思路,所有的类都会优先被启动类加载器加载,那么也就是说只需要加载一次Object,当其他类需要Object时,直接返回已经加载过的Object.class。

image-20200731122126339

posted @ 2020-08-05 17:21  just-reboot  阅读(162)  评论(0编辑  收藏  举报