读书笔记-深入理解Java虚拟机#5

一、类加载的时机

《读书笔记-深入理解Java虚拟机#5》

  • 触发初始化阶段的5种情况:
    1. 遇到new、getstatic、putstatic或invokstatic;
    2. 使用java.lang.reflect包的方法对类进行反射调用;
    3. 当初始化一个类,发现父类未初始化,先初始化父类;
    4. 虚拟机启动时,指定一个执行的主类,先触发主类初始化;
    5. JDK1.7,java.lang.invoke.MethodHandle实例解析结果REF_getStatic、REF_putStatic、REF_invokeStatic未初始化,则触发先初始化。

二、类加载的过程

加载

  • 通过一个类的全限定名来获取定义此类的二进制字节流。
  • 将这个字节流所代表的的静态存储结构转换为方法区的运行时的数据结构。
  • 在内存中生成一个代表这个类的对象,作为方法区这个类的各种数据的访问入口。
  • 加载完成后,虚拟机外部的二进制流按虚拟机规定格式存储在方法区之中,内存中实例化一个类的对象,作为程序访问这些类型数据的外部访问接口。

验证

  • 目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求。
  • 验证阶段完成下面4个阶段的检验动作:
    1. 文件格式验证,验证字节流是否符合Class文件格式规范;
    2. 元数据验证,对字节码信息进行语义分析,保证符合规范;
    3. 字节码验证,通过对数据流和控制流分析,确定语义合法符合逻辑;
    4. 符号引用验证,对类自身以外的信息进行匹配性校验,确保解析动作能正常执行;

准备

  • 为类变量分配内存并设置类变量的初始值的阶段。
  • 这一阶段仅分配类变量(被static修饰的),不包括实例变量,实例变量在对象实例化时分配在java堆中。
  • public static int value =123 准备阶段时value =0 赋值123是初始化阶段才会执行。

解析

  • 虚拟机将常量池内的符号引用替换为直接引用的过程。

初始化

  • 类加载的最后一步。
  • 初始化阶段,真正开始执行类中定义的java程序代码。

三、类加载器

类与类加载器

  • 每一类加载器,都拥有一个独立的类名称空间,比较两个类是否相等,只有两个类由同一加载器加载前提才有意义。

双亲委派模型
《读书笔记-深入理解Java虚拟机#5》
破坏双亲委派模型

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/xingyadong1986/article/details/82754175
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞