java ClassLoader学习

参考地址:https://mp.weixin.qq.com/s/srja5a59WjFat4LhJOwRxQ

什么是类加载机制?

众所周知我们编写的Java文件都是以.java为后最的文件,编译器会将我们编写的.java文件编译成.class文件。简单的说,类加载机制就是从文件系统将一系列class文件读入jvm内存中为后续程序运行提供资源的动作。

类加载的流程

在这里插入图片描述

加载

通过一个类的完整路径,查找此类的字节码文件(class 文件即二进制文件)。将二进制的静态存储结构转化成方法区中的运行时数据结构,并且利用二进制流文件创建一个Class对象,存储在Java堆中用于对方法区的数据结构引入的入口。

  1. class文件的来源:有一点需要注意的是,类加载器不仅需要从文件系统中读取class文件,也可以通过网络获取,其他的jar包或者其他程序生成,如jsp.
  2. 类加载器:讲到类加载不得不讲到类加载的顺序和类加载器。Java中大概由四种类加载器,分别是启动类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),应用程序类加载器(application ClassLoader),自定义类加载器(Custom ClassLoader),依次属于继承关系(注意这里的继承不是Java类中的extends。
    在这里插入图片描述
  3. 启动类加载器(Bootstrap ClassLoader):主要负责加载存放在java_home/jre/lib下,或被Xbootclasspath参数指定的路径下的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap Cloader加载),启动类加载器是无法被Java程序直接引用的。
  4. 扩展类加载器(Extension ClassLoader):主要负责加载由:sun.misc.Launcher$ExtClassLoader实现,它负责加载java_home/jre/lib/ext目录中,或者由java.ext.dirs系统变量指定的路径中所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。
  5. 应用程序类加载器:这个类由sun.misc.Launcher$AppClassLoader实现。是ClassLoader中getSystemClassLoader()方法的返回值。它负责用户路径(ClassPath)所指定的类库。用户可以直接使用。如果用户没有自己定义类加载器,默认使用这个。
  6. 自定义类加载器:用户自己定义的类加载器。
  7. 双亲委派原则:类加载器在加载 class 文件的时候,遵从双亲委派原则,意思是加载依次由父加载器先执行加载动作,只有当父加载器没有加载到 class 文件时才由子类加载器进行加载。这种机制很好的保证了 Java API 的安全性,使得 JDK 的代码不会被篡改。

验证

  1. 验证的过程只要是保证 class 文件的安全性和正确性,确保加载了该 class 文件不会导致 JVM 出现任何异常,不会危害JVM 的自身安全。验证包括对文件格式的验证,元数据和字节码的验证。

准备

  1. 准备阶段是为类变量进行内存分配和初始化零值的过程。注意这时候分配的是类变量的内存,这些内存会在方法区中分配。此时不会分配实例变量的内存,因为实例变量是在实例化对象时一起创建在Java 堆中的。而且此时类变量是赋值为零值,即 int 类型的零值为 0,引用类型零值为 null,而不是代码中显示赋值的数值。

解析

解析阶段是虚拟机将常量池中的符号引用转化为直接引用的过程。在 class 文件中常量池里面存放了字面量和符号引用,符号引用包括类和接口的全限定名以及字段和方法的名称与描述符。在 JVM 动态链接的时候需要根据这些符号引用来转换为直接引用存放内存使用。

初始化

初始化的阶段是类加载的最后一步,这个阶段主要是执行 java 代码,进行相关初始化的动作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值