类加载和初始化

简介

调用java命令运行某个程序时,该命令会启动一个java 虚拟机进程。程序使用某个类时,如果该类没有被加载到内存中,则系统会通过加载、连接、初始化3个步骤对该类进行初始化。类加载指的是将类的class 文件读入内存,并创建一个java.lang.Class 对象,程序使用任何类时系统都会建立一个java.lang.Class对象。

加载器

类加载由类加载器完成,类加载器由JVM 提供,JVM 提供的类加载器通常称为系统类加载器,开发者可以继承ClassLoader 创建自己的类加载器。
JVM启动时会形成3个类加载器组成的加载器层次结构:
1.Bootstrap ClassLoader: 根类加载器
2.Extension ClassLoader: 扩展类加载器
3.System ClassLoader:系统类加载器

Bootstrap ClassLoader 是引导加载器,负责加载java 核心类,使用C++ 实现的,它不是java.lang.ClassLoader 的子类;

Extension ClassLoader 称为扩展类加载器,负责加载JRE 的扩展目录(JAVA_HOME/jre/lib/ext) 中的jar 包类;

System ClassLoader 称为系统类加载器,负责在JVM 启动时记载来自java 命令的 -classpath 选项,或CLASSPATH 环境变量指定加载的jar 包和类路径。程序可通过ClassLoader 的静态方法getSystemClassLoader() 获取系统类加载器。

系统为所有加载的类生成一个java.lang.Class 实例,一旦一个类被加载进JVM,同一个类就不会被再次加载。JVM 中使用类加载器和全限定类名作为唯一标识。

类的连接

类被加载生成对于的Class 对象后,会进入连接阶段:
1.验证: 验证阶段用于校验被加载的类是否有正确的内部结构
2.准备: 为类变量分配内存,设置默认初始值
3.解析: 把类的2进制数据中的符号引用替换成直接引用

类的初始化

JVM 初始化一个类需要经历如下步骤:
1.如果这个类没有被加载、连接,则程序先加载、连接该类;
2.如果该类的直接父类没有被初始化,则先初始化直接父类;
3.如果该类中有初始化语句则先执行初始化语句

JVM 初始化父类初始化也遵循1~3 的流程,即先初始化继承结构最顶层,再依次初始化间接父类、直接父类、本类。

加载机制

一、父类委托:
先让parent (父) 类加载器加载该class ,父类加载器无法加载该类时才使用子类加载器加载。

二、缓存机制:
缓存机制保障所有加载过的Class 都被缓存,程序使用某个类时,先从缓存区查找是否缓存该类,没被缓存则加载该类。
获取类加载器层次结构:

package 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值