JVM加载类的原理

如何加载class文件:

1.利用类加载器将将class文件读入到内存中,并且为这个class文件创建一个实例对象(java.lang.class),如果这个类已经被加载过了,就不会再被加载(同一个类的唯一标识:包名+类名)。

2.将类加载完之后,就是进行连接操作。

3.对类进行初始化。

接下来谈谈各个步骤的详细内容:

一.类的加载

利用不同的加载器,对不同来源的class文件进行加载,class文件有以下来源:

1,我们打好的jar包

2.   网络上的class文件

3.从本地文件系统加载的class

类加载器:

根类加载器(bootstrap classLoader):它的底层是采用c++代码写的,它其实不是classLoader的子类,它也没有子类,

因此它其实是不属于类的加载层级结构的,它完全由jvm来控制的,它负责加载的是java的核心库,比如说String,system这些核心库类。

扩展类加载器(extension classLoader):它负责加载的是jre的扩展目录(java.ext.dirs下的jar包),比如说咱们自己打的jar包。

应用类加载器(system ClassLoader):它负责加载java命令的-classpath选项和java.class.path系统的属性,它的父类是extentionclassLoader。

而extention classLoader和systemclassLoader都是继承了urlclassloader,urlclassloader的父类是classLoader,

因此层级关系大概如下:

用户类加载器->系统类加载器->扩展类加载器

jvm加载类的机制主要是如下几种:

(1)全盘负责:当一个类加载器加载某个class时,还会去加载它所依赖和引用的class,这些被依赖和引用的class文件其实就是隐式加载的方式。而主动加载的某个class是显示加载的方式。

(2)父类委托:先让父类加载器尝试加载此class文件,如果父类无法加载此class文件,则由当前类加载器去加载此clas文件。

(3)缓存机制:先从缓存区读取是否存在该class,如果没有,则利用加载器将其加载成class对象,然后存到缓存区中。

因此加载类的过程如下:

1.先在缓存区取class对象,如果不存在,则会递归请求父类加载器加载此class(用户类加载器->系统类加载器->扩展类加载器),如果父类加载器无法加载此class,则向下递归利用子类加载器加载此class,直到当前类加载器无法加载到class,抛出classnotfindexception,否则返回java.lang.class对象。

二.类的连接

1.验证:检查被加载的类是否有正确的内部结构,

2.准备:类加载器阶段负责对类的类变量分配内存,并且设置默认初始值

3.解析,将类的二进制数据的符号引用转化成直接引用。

三.类的初始化

初始化一个类时,假如直接父类没有初始化,则先初始化其直接父类,,假如类中有初始化语句,则先执行这些初始化语句,

因此类代码的执行顺序大概是这样子的

父类的静态代码块->子类的静态代码块->父类的初始化代码块(在创建对象时隐式执行,且在构造器前执行)->父类的构造函数->子类初始化代码块->子类构造函数

因此每次最先执行顶级的java.lang.object,jvm会保证这个类的所有父类被初始化(包括直接父类和间接父类)

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM加载是由加载器及其子实现的。加载器是Java运行时系统的重要组成部分,负责在运行时查找和加载文件中的。在JVM中,加载器按照一定的层次结构进行组织,每个加载器负责加载特定位置的。其中,启动加载器(Bootstrap ClassLoader)是负责加载存放在<JAVA_HOME>/lib目录中的核心库,如rt.jar、resources.jar等,同时也可以加载通过-Xbootclasspath参数指定的路径中的库。启动加载器是用C语言编写的,随着JVM启动而加载。当JVM需要使用某个时,它会通过加载器查找并加载这个加载过程会经历连接阶段,包括验证、准备和解析。在验证阶段,JVM会确保加载信息符合JVM规范。在准备阶段,JVM会为变量分配内存并设置初始值,在方法区中分配这些内存。在解析阶段,JVM会根据符号引用替换为直接引用,以便后续的使用。通过加载器的协同工作,JVM能够在运行时动态加载,从而实现Java的灵活性和跨平台性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JVM加载原理](https://blog.csdn.net/ChineseSoftware/article/details/119212339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JVM加载器](https://blog.csdn.net/rockvine/article/details/124825354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值