Java类加载机制

Java类加载机制

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

(1) 装载:查找和导入Class文件;

(2) 链接:把类的二进制数据合并到JRE中;

(a)校验:检查载入Class文件数据的正确性;

(b)准备:给类的静态变量分配存储空间;

(c)解析:将符号引用转成直接引用;

(3) 初始化:对类的静态变量,静态代码块执行初始化操作

BootStrapLoader(启动类加载器) : 它是JVM内部实现的加载器,负责加载 ${JAVA_HOME}/lib/rt.jar 这个核心类库,JVM内部 C++ 语言实现,开发者不允许直接操作(它不是继承自ClassLoader的)。
ExtClassLoader(扩展类加载器):负责把 {JAVA_HOME}/lib/ext/*.jar 这个扩展包里的类加载到 JVM ,JAVA 层面实现,开发者可以直接操作。
AppClassLoader(系统类加载器):加载的是 classpath 所指定的类,它也是Java程序默认的类加载器,Java层面实现,开发者可以直接操作。
在这里插入图片描述
基本上所有的类加载器都是 ClassLoader 类的一个实现,除了 bootStrap 这个系统内部的加载器之外,

双亲委派机制
双亲委派的意思是如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。这里的双亲其实就指的是父类,没有mother。父类也不是我们平日所说的那种继承关系,只是调用逻辑是这样。

自定义类加载器
既然JVM已经提供了默认的类加载器,但是有一些弊端,比如只能加载指定目录下的jar包或者class文件,如果我们想加载其它位置的 jar或者class文件 时,比如网络上的某 class通过动态加载到内存来使用,这样的场景默认的类加载器就不能给我们提供帮助了,所以就要自己定义 ClassLoader。自定义类的加载器继承 ClassLoader 然后重写父类的findClass方法,之所以只重写这个方法是因为JDK已经在loadClass中帮我们使用了ClassLoader搜索类的算法,当在loadClass方法中找不到类时,loadClass方法就会调用findClass方法来搜索类,所以只要重写它就好了。

类的初始化步骤
当一个类含有父类的时候:(静态代码块和静态属性,层级一样的,按照编写顺序执行的)
父类的静态属性
父类的静态代码块
子类的静态属性
子类的静态代码块
父类的非静态属性
父类的非静态代码块
父类的构造方法
子类的非静态属性
子类的父静态代码块
子类的构造方法
再看没父类的类的加载
1.类的静态属性
2.类的静态代码块
3.类的非静态属性
4.类的非静态代码块
5.构造方法

参考文章:https://www.jianshu.com/p/d23f066367a3,http://www.ityouknow.com/jvm/2017/09/28/jvm-overview.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值