Java类加载机制


Java类加载机制
JVM
同一个JVM中所有的线程,变量都同处一个进程
终止JVM进程的方法
程序运行正常结束
程序运行时使用了System.exit()或者Runtime.getRuntime().exit()直接关闭虚拟机
程序执行遇到未捕获的异常或错误
程序所在平台强制关闭JVM进程
类初始化的时机
创建某个类的实例
new
通过反射来创建实例
通过反序列化来创建实例
调用某个类的静态方法
访问某个类的静态变量
通过反射的方法强制为某个类或接口创建相应的Class对象
初始化某个类的子类
直接使用exe命令来运行某个主类
类加载
概念
程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化这三个步骤对该类进行初始化,JVM会连续执行这三个过程,所以也将这三个过程统称为类加载
类的加载
概念
将类的.class文件读到内存,并为之建立一个java.lang.Class对象
类加载器
JVM提供的类加载器
开发者通过继承ClassLoader基类自定义类加载器
从不同的来源加载类的二进制数据
本地文件系统
JAR包
网络
动态编译一个Java源文件,并执行加载
类加载器通常无需等到首次使用某个类时才加载这个类,虚拟机规范允许系统预先加载某个类
类的连接
概念
类加载之后系统为之生成了对应的Class对象,接着进入连接阶段,连接阶段负责把类的二进制文件合并到JRE中
连接阶段的三个阶段
验证
验证该类是否有正确的内部结构,并和其他类协调一致
准备
为类变量分配内存,并设置初始值
解析
将类的二进制数据中的符号引用转换成直接引用
类的初始化
概念
在初始化阶段,虚拟机负责对类进行初始化,主要就是初始化类变量
Java类中对类变量进行初始化的俩种方法
声明变量时制定初始值
使用静态初始化块
JVM初始化一个类的步骤
如果该类没有被加载和连接,那么闲加载并连接该类
如果该类的父类还没有被初始化,先初始化该类的父类
系统以此执行初始化语句
宏变量
静态变量
final修饰
编译时就可以确定值
类加载
概念
程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化这三个步骤对该类进行初始化,JVM会连续执行这三个过程,所以也将这三个过程统称为类加载
类的加载
概念
将类的.class文件读到内存,并为之建立一个java.lang.Class对象
类加载器
JVM提供的类加载器
开发者通过继承ClassLoader基类自定义类加载器
从不同的来源加载类的二进制数据
本地文件系统
JAR包
网络
动态编译一个Java源文件,并执行加载
类加载器通常无需等到首次使用某个类时才加载这个类,虚拟机规范允许系统预先加载某个类
类的连接
概念
类加载之后系统为之生成了对应的Class对象,接着进入连接阶段,连接阶段负责把类的二进制文件合并到JRE中
连接阶段的三个阶段
验证
验证该类是否有正确的内部结构,并和其他类协调一致
准备
为类变量分配内存,并设置初始值
解析
将类的二进制数据中的符号引用转换成直接引用
类的初始化
概念
在初始化阶段,虚拟机负责对类进行初始化,主要就是初始化类变量
Java类中对类变量进行初始化的俩种方法
声明变量时制定初始值
使用静态初始化块
JVM初始化一个类的步骤
如果该类没有被加载和连接,那么闲加载并连接该类
如果该类的父类还没有被初始化,先初始化该类的父类
系统以此执行初始化语句
宏变量
静态变量
final修饰
编译时就可以确定值
JVM
同一个JVM中所有的线程,变量都同处一个进程
终止JVM进程的方法
程序运行正常结束
程序运行时使用了System.exit()或者Runtime.getRuntime().exit()直接关闭虚拟机
程序执行遇到未捕获的异常或错误
程序所在平台强制关闭JVM进程
类初始化的时机
创建某个类的实例
new
通过反射来创建实例
通过反序列化来创建实例
调用某个类的静态方法
访问某个类的静态变量
通过反射的方法强制为某个类或接口创建相应的Class对象
初始化某个类的子类
直接使用exe命令来运行某个主类





1)Bootstrap ClassLoader

 

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

 

2)ExtensionClassLoader

 

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

 

3)App ClassLoader

 

负责记载classpath中指定的jar包及目录中class

 

4)CustomClassLoader

 

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

 

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从CustomClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值