Java JVM类加载机制-2019-09-10

                                                    虚拟机类加载机制

       ClassLoader 类加载器,主要的作用是将Class文件加载到JVM虚拟机中。JVM启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载显示加载

       隐式加载:程序代码中不通过调用ClassLoader来加载需要的类,而是通过JVM类自动加载需要的类到内存中。具体哪些会加载参考2。JVM在解析当前这个类时,发现引用的类不在内存中,那么就会自动将这些类加载到内存中。

      显示加载:代码中通过Class.forName()、this.getClass.getClassLoader.LoadClass() ,自定义加载器中的findClass()方法。 

1、加载过程? 

     编译:从本地机器码转变成字节码。      

     加载:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成被JVM能直接使用的Java类型,这叫类加载机制。类型的加载、连接和初始化过程都是在程序运行期间完成的。

   生命周期:加载(Loading)、连接【验证(Verfication)、准备(Preparation)、解析(Reslution)】、初始化(Initaliztion)、使用(Using)和卸载(Unloding)

2、什么时候必须立即初始化? (隐式加载)

  •  遇到new实例化对象时、读取或设置一个类的静态字段的时候,以及调用一个类的静态方法的时候;
  •  使用java.lang.reflect包对类进行反射调用;
  •  当初始化一个类,如发现期父类没有进行初始化,则需要先触发其父类;
  •  用户执行的主类(main)入口   

3、类初始化顺序 ?

    父类静态变量->父类静态代码块;静态块对属性可以赋值,但不能访问。(只初始化一次)

    子类静态变量->子类静态代码块(只初始化一次)

    父类普通变量->父类普通代码块(每new对象都会执行)->父类构造方法

    子类普通变量->子类普通代码块(每new对象都会执行)->子类构造方法

4、类加载器(双亲委派模型)继承关系

  •  根类加载器(启动类加载器)Bootstrap ClassLoader,由C++编写,是虚拟机自身的一部分;加载<JAVA_HOME>\lib下所有jar。如rt.jar(按文件名识别,名字不符即使在lib目标下也不会被加载)
  •  扩展类加载器 Extension ClassLoader 负责加载lib/ext目录下的
  •  应用程序类加载器 Application ClassLoader 负责加载 classPath下的所有类
  •  自定义加载器 extends ClassLoader 

     加载过程:如果一个类加载器收到了类加载的请求,当然首先检查是否已经被加载过,然后它不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己完成不了加载,子加载器才会尝试加载;

    优势:Java类随着它的类加载器一起具备了优先级的层次关系,也具备了唯一性;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值