【深入理解jvm阅读笔记】类加载机制

定义

类加载机制指的是把Class文件变成jvm能直接使用的java文件的过程

 

类的生命周期

加载→验证→准备→解析→初始化→使用→卸载

 

类加载过程

也就是类的生命周期的前5个,接下来介绍一下每个过程的功能

加载:主要3个功能。①通过一个类的全限定名来获取此类的二进制字节流,就是通过Class.forName("全类名")方法将java程序从Source源代码阶段引入到Class类对象阶段

                                  ②将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

                                  ③在内存中生成一个代表这个类的java.lang.Class对象(第①点句号后边的是对①③两点的概括)

验证:确保Class文件的字节流中包含的信息符合规范,不会危害虚拟机的安全。

准备:对静态变量分配内存并设置初始值的阶段,这些变量使用的内存都应该在方法区中分配

           举例  public static int value = 123; 这里value的初始值是0而不是123,因为这时候尚未开始执行任何java方法。但是对于

                    public static final int value = 123; 这里value的初始值就是123了,因为这里的value是常量

解析:将常量池内的符号引用替换为直接引用

初始化:直到这个阶段,jvm才开始执行类中编写的java程序代码。

              在准备阶段,变量已经被赋值过一次系统要求的零值,而在初始化阶段,则会根据程序员的编码去初始化类变量和其他资源。说的专业点,初始化阶段就是执行类构造器<clinit>()方法的过程。

              关于<clinit>()有如下的介绍

              ①<clinit>()是由编译器自动收集类中所有类变量的赋值动作和static{}语句块而合并产生的。从这里可以看出<clinit>()不是必须的,如果一个类中既没有static{}也没有对变量的赋值操作的话。

              ②jvm会保证在子类的<clinit>()方法执行之前,父类的<clinit>()方法已经执行完毕。类的加载顺序那个顺口溜就是从这里来的

              ③接口中不可以使用静态语句块,但仍然有类变量初始化的赋值操作,因此接口与类一样都会生成 <clinit>() 方法。但接口与类不同的是,执行接口的 <clinit>() 方法不需要先执行父接口的 <clinit>() 方                      法。只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的 <clinit>() 方法。

              

类加载器(Class Loader)

主要负责类加载过程的”加载“阶段。主要涉及到的知识点是双亲委派模型

 该模型要求除了顶层的启动类加载器外,其它的类加载器都要有自己的父类加载器。

工作过程是,一个类加载器首先将类加载请求转发到父类加载器,因此所有的加载请求最后都会到顶层的启动类加载器中,只有当父类加载器无法完成时才尝试自己加载。

好处是,使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一。

              例如 java.lang.Object 存放在 rt.jar 中,如果编写另外一个 java.lang.Object 并放到 ClassPath 中,程序可以编译通过。由于双亲委派模型的存在,所以在 rt.jar 中的 Object 比在 ClassPath 中的 Object   优先级更高,这是因为 rt.jar 中的 Object 使用的是启动类加载器,而 ClassPath 中的 Object 使用的是应用程序类加载器。rt.jar 中的 Object 优先级更高,那么程序中所有的 Object 都是这个Object

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值